我正在尝试使用 Python 模块 scikit-learn 将单变量特征选择方法应用于 svmlight 格式的回归(即连续值响应值)数据集。
我正在使用 scikit-learn 0.11 版。
我尝试了两种方法 - 第一种失败了,第二种对我的玩具数据集有效,但我认为对于真实数据集会产生毫无意义的结果。
我希望获得有关可用于为回归数据集选择前 N 个特征的适当单变量特征选择方法的建议。我要么 (a) 弄清楚如何使 f_regression 函数工作,要么 (b) 听取其他建议。
上述两种方式:
- 我尝试使用 sklearn.feature_selection.f_regression(X,Y)。
失败并显示以下错误消息: “TypeError:copy() 恰好接受 1 个参数(给定 2 个)”
- 我尝试使用 chi2(X,Y)。这“有效”,但我怀疑这是因为我的玩具数据集中的两个响应值 0.1 和 1.8 被视为类标签?据推测,这不会为真实数据集产生有意义的卡方统计量,因为真实数据集会有大量可能的响应值,并且每个单元格中的数字 [具有特定的响应值和被测试属性的值] 将是低的?
请找到粘贴到此消息末尾的我的玩具数据集。
下面的代码片段应该给出我上面描述的结果。
from sklearn.datasets import load_svmlight_file
X_train_data, Y_train_data = load_svmlight_file(svmlight_format_train_file) #i.e. change this to the name of my toy dataset file
from sklearn.feature_selection import SelectKBest
featureSelector = SelectKBest(score_func="one of the two functions I refer to above",k=2) #sorry, I hope this message is clear
featureSelector.fit(X_train_data,Y_train_data)
print [1+zero_based_index for zero_based_index in list(featureSelector.get_support(indices=True))] #This should print the indices of the top 2 features
提前致谢。
理查德
我设计的 svmlight 文件的内容——为清楚起见插入了额外的空行:
1.8 1:1.000000 2:1.000000 4:1.000000 6:1.000000#mA
1.8 1:1.000000 2:1.000000#mB
0.1 5:1.000000#mC
1.8 1:1.000000 2:1.000000#mD
0.1 3:1.000000 4:1.000000#mE
0.1 3:1.000000#mF
1.8 2:1.000000 4:1.000000 5:1.000000 6:1.000000#mG
1.8 2:1.000000#mH
最佳答案
正如 larsmans 指出的,chi2 不能用于回归数据的特征选择。
更新到 scikit-learn 版本 0.13 后,以下代码为上述玩具数据集选择了前两个特征(根据 f_regression 测试)。
def f_regression(X,Y):
import sklearn
return sklearn.feature_selection.f_regression(X,Y,center=False) #center=True (the default) would not work ("ValueError: center=True only allowed for dense data") but should presumably work in general
from sklearn.datasets import load_svmlight_file
X_train_data, Y_train_data = load_svmlight_file(svmlight_format_train_file) #i.e. change this to the name of my toy dataset file
from sklearn.feature_selection import SelectKBest
featureSelector = SelectKBest(score_func=f_regression,k=2)
featureSelector.fit(X_train_data,Y_train_data)
print [1+zero_based_index for zero_based_index in list(featureSelector.get_support(indices=True))]
关于python - 回归数据的 Scikit-learn 特征选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15484011/