嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行。相比于过滤法,嵌入法的结果会更加精确到模型的效用本身,对于提高特定模型的效力有更好的效果。由于考虑特征对模型的贡献,将低贡献的特征删除,本质上还是特征过滤。
但嵌入法中使用的加权系数是不固定的,对模型完全没有作用的加权系数会为0,当大量特征都对模型有贡献,且贡献不一时,我们很难去界定一个有效的临界值。此时,权值系数系数只能通过学习曲线去判断,因此计算量会很大,会非常耗时。
嵌入法基本用法
import pandas as pd from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import RandomForestClassifier as RFC from sklearn.model_selection import cross_val_score data = pd.read_csv('./datas/digit_recognizor_simple.csv') x = data.iloc[:, 1:] y = data.iloc[:, 0] RFC_ = RFC(random_state=42) x_embedded = SelectFromModel(RFC_, threshold=0.0005).fit_transform(x, y) print(x_embedded.shape) #(1000, 351) score = cross_val_score(RFC_, x_embedded, y, cv=10).mean() print(score) # 0.88
学习曲线调参
import numpy as np import matplotlib.pyplot as plt scores = [] thresholds = np.linspace(0, RFC_.fit(x, y).feature_importances_.max(), 20) for ts in thresholds: x_embedded = SelectFromModel(RFC_, threshold=ts).fit_transform(x, y) score = cross_val_score(RFC_, x_embedded, y, cv=10).mean() scores.append(score) plt.plot(thresholds, scores) plt.xticks(thresholds) plt.show()
通过画学习曲线,threshold=0.00045取得最优效果,准确率0.92左右,得出特征数据依然小于方差筛选,而且模型表现比没有筛选之前更高。然而,在算法本身很复杂的情况下,过滤法的计算远比嵌入法快,所以在大型数据中,还是会优先考虑过滤法。
本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/272