“挽弓当挽强,用剑当用长,射人先射马,擒贼先擒王。。。” 早在唐朝,诗人杜甫就告诉我们做模型前,要对大数据进行处理,抓住影响目标值的要害,举要删芜,去除噪音,这样做出的模型才会“似倩麻姑痒处抓”。
大数据的特征工程,就是算出原始数据中各因子对目标值的贡献度,剔除和目标值没有关系的因子(滥竽充数的特征),抽取对结果有用的信息。通常专业的背景知识可帮助特征在机器学习中发挥更好的作用。采用以下几步:
从所有特征中,选出最优的特征个数或百分比
图形化输出不同特征百分比对结果的影响
按照特征的重要程度排序
按照最优百分比重构特征,并重新构建模型
一言不合就上代码,以ExtraTreeRegressor回归算法为例:
1。从sklearn库调用feature_selection模块,计算最优特征百分比SelectPercentile(计算最优特征数量可用SelectKBest),本例中,最优值是65%
from sklearn.ensemble import ExtraTreesRegressor
etr=ExtraTreesRegressor()
from sklearn import feature_selection
from sklearn.cross_validation import cross_val_score
percentiles=range(1,100,2)
results=[]
for i in percentiles:
fs=feature_selection.SelectPercentile(feature_selection.f_regression, percentile=i)
x_train_fs=fs.fit_transform(x_train,y_train)
scores=cross_val_score(etr,x_train_fs, y_train,cv=5)
results=np.append(results,scores.mean())
print(results)
opt=np.where(results==results.max())[0]
print('Optimal number of features is: %d percent'%(2*opt+1))
2。图形化输出特征百分比和模型分数之间的关系,由图可见,最优百分比出现在65%,即抽出65%的特征参与计算,可得到最佳模型(注意此处有坑)。
import pylab as pl
pl.figure()
pl.plot(percentiles,results)
pl.xlabel('percentiles of features')
pl.ylabel('accuracy')
pl.show()
3。特征重要度排序,输出特征列表,并图形化输出。谁是强弓,谁是长剑,一目了然。
importances=etr.feature_importances_
indices=np.argsort(importances)[::-1]
for f in range(x_train.shape[1]):
print("%2d.feature %3d %20s (%.4f)" %(f+1,indices[f],column_names[indices[f]], importances[indices[f]]))
import matplotlib.pyplot as plt
plt.figure()
plt.title('ExtraTreeRegressor Feature importances')
plt.bar(range(x_train.shape[1]),importances[indices],color='red',yerr=std[indices],align='center')
plt.xticks(range(x_train.shape[1]),indices)
plt.xlim([-1,x_train.shape[1]])
plt.show()
4。用选出的65%的特征,重构数据集,并用新的数据集做回归分析。
fs=feature_selection.SelectPercentile(feature_selection.f_regression, percentile=2*opt+1)
x_train_fs=fs.fit_transform(x_train,y_train)
etr.fit(x_train_fs,y_train)
x_test_fs=fs.transform(x_test)
etr_y_predict_fs=etr.predict(x_test_fs)
特征重构后新的数据集重新做的模型未必比原始数据的模型拟合度好,但是可以简化特征,减少计算量。当特征量不大时,可以省略这一步,但是仍然建议对每个模型都做feature_importance,这样有助于识别不同特征的重要程度。如上例中,特征10、4、9对结果的影响占据前三甲,当这三个因素变化时,掐指一算,目标值必有变化。
领取专属 10元无门槛券
私享最新 技术干货