我尝试使用np.corrcoef
来评估最好的特征x与标签y的比较。但我认为一定有更好的方法来做到这一点。corr数组看起来像--> [0.73117578 0.40620284 0.82562664]
,然后我选择索引2,这是我最好的特性。
data_x = np.array([[0.885, 0.330, 9.100],[0.725, 0.390, 10.900],[0.560, 0.500, 9.400],[0.735, 0.570, 9.800],[0.610, 0.630, 8.400],[0.260, 0.630, 11.800],[0.500, 0.680, 10.500],[0.320, 0.780, 10.000]])
data_y = np.array([4.000, 5.000, 6.000, 5.000, 3.000, 8.000, 7.000, 6.000])
corr = []
for i in range(0, len(data_y)):
featureX = data_x[:, i].reshape(-1)
matrix = np.corrcoef(featureX, data_y)
corr.append(matrix[1, 0])
corr = np.array(corr)
corr = np.absolute(corr)
splitXi = np.argmax(corr)
splitXi = int(splitXi)
4条答案
按热度按时间v8wbuo2f1#
您的
data_x
将列作为特征,将行作为观测。因此,您可以使用np.transpose
或rowvar=False
作为np.corrcoef
的参数。vwoqyblh2#
在我看来,你似乎在寻找 * 特性的重要性 *,而不是相关性(如果我错了,请纠正我)。
找出特征重要性的一种方法是使用RandomForestRegressor:
lstz6jyr3#
特征1为负且强相关(-0.73)特征2为正且弱相关(.40)特征3为正且强相关(.82%)
corrcoef检查来自线的斜率的方差。与线的斜率的距离的变化越小,与数据特征的相关性或线拟合越高。
如果您正在寻找功能重要性
输出
5anewei64#
编辑:
在这种情况下,您可以自己实现相关性,以便在速度和内存占用方面做得更好:
示例:
针对
pandas.corrwith
进行测试(下面的“pandas方法”)原文回答:
已接受答案的澄清
首先我想解释一下为什么armamut's answer可以工作。
np.corrcoef(data_x, data_y, rowvar=False)
等价于np.corrcoef(np.concatenate([data_x, data_y[:, np.newaxis]], axis=1), rowvar=False)
,其中索引(i, j)
处的返回值对应于data_x
的第i列和第j列之间的相关系数。因此,切片[-1, :-1]
意味着找到最后一列data_y
与除最后一列之外的所有列data_x
之间的相关性。替代方式
显然,有两种方法可以找到相关性:一个使用
numpy.corrcoef
,另一个使用pandas.DataFrame.corrwith
,即:和/或
Profiling
使用Python
timeit
模块进行性能分析,以确定哪种方法最好。分析代码为:分析结果的图为:
根据结果,当功能不是那么多时,使用numpy比使用pandas要好得多。然而,随着特征数量的增加,性能的差异逐渐减小。在某些时候,使用pandas会比使用numpy更快。
numpy的另一个关键问题是内存消耗是$O(n^2)$,其中$n$是特征的数量。这意味着,至少在我的计算机上,50000个特征的相关矩阵将无法装入内存,因此numpy方法肯定会失败。
总结
如果没有那么多的特性,坚持使用numpy方法。否则,考虑首先使用
corrwith
将数组转换为pandas DataFrame和Series,最后转换回numpy数组。