特徵选择是机器学习中的核心概念之一,不相关或部分相关的特徵会对模型性能产生负面影响,也会有效能的问题,适当的挑选与目标变量最相关的特徵集,有助降低模型的复杂性,并最大限度地减少训练和推理所需的资源。这在您可能处理 TB 级数据或服务数百万个请求的生产模型中具有更大的影响,这篇将实作出5个不同的特徵选择,可从中取其优。
sklearn.ensemble.RandomForestClassifier
进行示范,程序码参考 Machine Learning Data Lifecycle in Production 课程,经过改并以不同资料及呈现过程,执行细节请参见 Colab 实作范例 。整理特徵 X ,部分属於分类资料可以用 One-Hot Encoding编码,并且处理无效栏位。
定义评估模型,固定以 RandomForestClassifier
模型进行训练,并对照各测试资料集之绩效。
def use_RandomForestClassifier_evaluation_metrics_on_test_set(X,Y):
X_train, X_test, Y_train, Y_test = train_test_split(
X, Y, test_size = 0.2 ,stratify=Y, random_state = 9527)
# 标准化
scaler = StandardScaler().fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# RandomForestClassifier训练模型
model = RandomForestClassifier(criterion='entropy', random_state=9527)
model.fit(X_train_scaled, Y_train)
# 预测
y_predict_result = model.predict(X_test_scaled)
# 回传evaluation_metrics_on_test_set
return {
'accuracy' : accuracy_score(Y_test, y_predict_result),
'roc' : roc_auc_score(Y_test, y_predict_result),
'precision' : precision_score(Y_test, y_predict_result),
'recall' : recall_score(Y_test, y_predict_result),
'f1' : f1_score(Y_test, y_predict_result),
'Feature Count' : len(X.columns)
}
查看关联性,越浅代表高度正相关,越深代表高度负相关,关联性介於 [1,-1] 之间。
1.1 依关联性移除特徵
选择具有与其他特徵高度相关的某特徵 ,设定阈值选取符合特徵,并移除该特徵。本次实作挑选的是 FamilySize
,选择超过门槛值的有代表性的特徵(无论正负相关 >0.2 ),并移除 FamilySize
本身。
# 取得具有与其他部分特徵高度相关的某特徵绝对值
cor_target = abs(cor["FamilySize"])
# 选择高度相关的特徵(阈值 = 0.2)
relevant_features = cor_target[cor_target>0.2]
# 选择特徵名称
names = [index for index, value in relevant_features.iteritems()]
# 删除目标特徵
names.remove('FamilySize')
print(names)
1.2 单变量特徵选取 Univariate Selection
sklearn.feature_selection.SelectKBest
选择最具影响力的特徵,这边示范 选取 10
个特徵。sklearn.feature_selection.RFE
筛选,设定筛选出 k=10
个重要特徵,该设定也是超参数,您可以自行设定。
# Recursive Feature Elimination
def rfe_selection( X , Y, k=10):
# Split train and test sets
X_train, X_test, Y_train, Y_test = train_test_split(
X,
Y,
test_size = 0.2,
stratify=Y,
random_state = 9527)
scaler = StandardScaler().fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
model = RandomForestClassifier(
criterion='entropy',
random_state=9527
)
rfe = RFE(model, k)
rfe = rfe.fit(X_train_scaled, Y_train)
feature_names = X.columns[rfe.get_support()]
return feature_names
sklearn.feature_selection.SelectFromModel
选择,以 threshold=0.013
作为筛选。经过一系列的特徵选择,您可以视需求选择所要采取的特徵,您追求准确率的话「递回特徵消除 Recursive feature elimination (RFE) 」分数最高,原本特徵从16个减少为10个,成功减少 37.5% ,运算资源可以大幅减少,而且各项指标成绩都优於全数选取的结果。
您会发现过程中有许多超参数是可以自行调整的,在您的手上或许仍有优化空间,譬如将RFE的特徵改 k=9 试试看,性能与成绩还可以再提升。
今日题目 题目连结:506. Relative Ranks 题目主题:Array, Sorting,...
盐水爱河 春天小栈 地点:盐水区西门路7-1号 时间:11:00~22:00 还记得当时会找到这一家...
django 基础篇 基本工具 env虚拟机 - virtualenvwrapper-win 安装:...
前言 在「大数据」红透透的时代,相信大家都听过 Python、爬虫。网路上亦有着大量的范例及 Sol...
虽然有点突然,但是我今天想来谈谈 container。对於大部分的人来说,讲到 container ...