数据科学 | 避坑!Python特征重要性分析中存在的问题
作者:Chelsea🐑
伯克利运筹学硕士,机器学习/数据科学死忠粉
编者按:在数据科学领域,有大量随手可得的算法包可以直接使用。当我们了解了各种模型的数学原理、并清楚自己想要调用的模型后就可以直接调用相关的算法包来实现整个过程、分析结果,但是这些已经搭建好的算法包背后的数学原理却很少有人深究,所以在数据处理和分析过程中可能会得出很多谬论或者非理想的结果。随机森林模型现在为业界广泛使用的模型之一,所以本文将对Scikit-learn包对随机森林模型特征重要性分析存在的问题进行一些讨论,希望能对今后调用随机森林模型相关包的同学起到一些帮助。
Sklearn包存在的问题分析 当我们运行完建立的模型以后,可能会对模型进行解释找到最有用的预测因子来获取有用信息、商业价值。比如在预测糖尿病时,哪些人体指标是最有影响力的;在预测超市大卖场的营业额的时候,是降低运输成本更重要、货品的货架摆放位置更重要还是促销更重要呢?或者在预测结果不理想需要再次做特征优化时,我们都可能会需要对特征的重要性进行分析。
Sklearn包存在的问题分析
实例分析--纽约房价预测
features = ['bathrooms', 'bedrooms', 'longitude', 'latitude', 'price'] #选取5个特征
dfr = df[features]
X_train, y_train = dfr.drop('price',axis=1), dfr['price']
X_train['random'] = np.random.random(size=len(X_train))
rf = RandomForestRegressor(
n_estimators=100,
min_samples_leaf=1,
n_jobs=-1,
oob_score=True)
rf.fit(X_train, y_train)
打乱特征测量法 随机森林的建立者Breiman和Cutler指出通这个方式计算出来的预测因子重要性排序通常和打乱特征测量法(permutation importance measure)得到的结果一致。
打乱特征测量法
- 首先我们需要将测试数据或者随机森林中的OOB(Out-of-Bag)数据最原始的准确率(如R squared score)作为一个准确率基线。
- 然后我们对其中的某个需要测量的特征做重新组合(permute)处理,也就是打乱数据重新排列
- 然后用测试数据(相同数据集)再跑一次模型,计算新的准确率
- 计算出新的准确率和基线准确率的差值
- 不需要对模型进行再次地训练
- 随机森林自带OOB数据,不需要再自己去选择用来测试的数据集
- 计算量比混沌法的计算量更大,相比于直接调用Sklearn包更复杂,业界使用较少
def permutation_importances(rf, X_train, y_train, metric):
baseline = metric(rf, X_train, y_train)
imp = [] for col in X_train.columns: #每个特征都做再组合处理
save = X_train[col].copy()
X_train[col] = np.random.permutation(X_train[col])
m = metric(rf, X_train, y_train)
X_train[col] = save
imp.append(baseline - m) #得到所有的特征处理后的准确率差值
return np.array(imp)
rf = RandomForestClassifier(...)
imp= permutation_importances(rf, X_train, y_train, oob_classifier_accuracy)
importances = rf.feature_importances_#调用Sklearn包得到重要性排序
indices = np.argsort(importances)[::-1]
# 输出排序
print("Feature ranking:")
featurerank=[]
for f in range(train_features.shape[1]):
featurerank.append(feature_list[indices[f]])
print("%d. feature %s (%f)" % (f + 1, feature_list[indices[f]], importances[indices[f]]))
#特征重要性可视化
plt.figure(figsize=(15,12))
feature_imp = pd.Series(importances,index=feature_list).sort_values(ascending=False)
sns.barplot(x= feature_imp,y=feature_imp.index)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
plt.legend()
plt.show()
from collections import defaultdict
from sklearn.model_selection import ShuffleSplit
X = train_features.as_matrix() # 特征
Y=np.array(train_labels) # 预测数据
scores = defaultdict(list) # 重要性变化的大小
features_=train_features.columns.values
for train_idx, test_idx in ShuffleSplit(n_splits=5, random_state=0, test_size=0.25, train_size=None).split(X):
X_train, X_test = X[train_idx], X[test_idx]
Y_train, Y_test = Y[train_idx], Y[test_idx]
reg = rf.fit(X_train, Y_train)
acc = r2_score(Y_test, reg.predict(X_test))
# 打乱特征
for i in range(X.shape[1]):
X_t = X_test.copy()
np.random.shuffle(X_t[:, i]) #shuffle用来打乱特征
shuff_acc = r2_score(Y_test, reg.predict(X_t))
scores[features_[i]].append((acc-shuff_acc)/acc)
#特征重要性可视化
rcParams['figure.figsize'] = 18, 12
mda_features = [f for f in scores.keys()]
mda_importance = [(np.mean(score)) for score in scores.values()]
mda_indices = np.argsort(mda_importance)
plt.title('Feature Importances')
plt.barh(range(len(mda_indices)), [mda_importance[i] for i in mda_indices], color='#8f63f4', align='center')
plt.yticks(range(len(mda_indices)), [mda_features[i] for i in mda_indices])
plt.xlabel('Mean decrease accuracy')
plt.show()
参考文献:
—— 完 ——
文章作者:Chelsea🐑
责任编辑:周岩
微信编辑:葡萄
文章由『运筹OR帷幄』原创发布,如需转载请与『运筹OR帷幄』公众号联系
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。