随机森林:对UCI数据集的分类实现
关于随机森林的原理网上有许许多多,这里不再赘述。sklearn中的RandomForestClassifier包即可满足你对随机森林的调用。
UCI数据集可在UCI官方页面中进行下载并使用。
本文主要用于记录笔者自己的代码过程。
几个简易的数据集可从 sklearn.datasets中进行调用,如红酒数据 wine,鸢尾花数据 iris,可参考知乎的这篇文章sklearn中的datasets数据集。
若数据中并非全部为数字,如有‘male’、‘female’等非数字数据,可调用sklearn.preprocessing进行transform。
关于参数的选择可以进行迭代计算,然后进行可视化,如:
# 大致测试 n_estimators 的最优范围
score1 = []
for i in range(0, 150, 10):
clf = RandomForestClassifier(n_estimators=i+1,
n_jobs=-1,
random_state=90)
score = cross_val_score(clf, wine.data, wine.target, cv=5).mean()
score1.append(score)
print(max(score1))
print((score1.index(max(score1))*10)+1)
plt.figure(figsize=[20,5])
plt.plot(range(1,151,10),score1)
plt.show()
代码结果如下图所示,然后再进行调整。
RandomForest 有调参神器,在sklearn.model_selection中的GridSearchCV,可参考网页。
代码参考如下:
#调整 min_samples_leaf
param_grid={'min_samples_leaf':np.arange(1, 4, 1)}
rfc = RandomForestClassifier(n_estimators=14
,random_state=90
)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(wine.data,wine.target)
print(GS.best_params_)
print(GS.best_score_)
最后进行结果参数评估,如acc, precision, recall等评估指标,代码如下:
clf = RandomForestClassifier(n_estimators=14
,random_state=90
,min_samples_leaf=1
,min_samples_split=9
,criterion='gini')
clf.fit(train_data, train_label) # 进行学习
train_pred_results=clf.predict(train_data)
print('acc_train = ' + str(np.round(accuracy_score(train_pred_results, train_label), 5)))
test_pred_results=clf.predict(test_data)
print('acc_test = ' + str(np.round(accuracy_score(test_pred_results, test_label), 5)))
print(classification_report(test_label, test_pred_results))
最后进行数据维度重要性可视化,参考代码如下:
features = ['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium'
, 'total_phenols', 'flavanoids', 'nonflavanoid_phenols',
'proanthocyanins', 'color_intensity', 'hue',
'od280/od315_of_diluted_wines', 'proline']
importances = clf.feature_importances_
indices = np.argsort(importances)[::-1]
num_features = len(importances)
print(num_features)
#将特征重要度以柱状图展示
plt.figure()
plt.title("Feature importances")
plt.bar(range(num_features), importances[indices], color="g", align="center")
plt.xticks(range(num_features), [features[i] for i in indices], rotation='45')
plt.xlim([-1, num_features])
plt.show()
#输出各个特征的重要度
for i in indices:
print ("{0} - {1:.3f}".format(features[i], importances[i]))
其可视化结果如下:
以及最终的混淆矩阵可视化,代码如下:
import seaborn as sns
import matplotlib as plt
%matplotlib inline
import matplotlib.pyplot as plt
conf_mat = confusion_matrix(test_label, test_pred_results)
sns.set(font_scale=3)
plt.figure(figsize=(16,14))
sns.heatmap(conf_mat, annot=True, fmt="d", annot_kws={"size": 20});
plt.title("Confusion matrix", fontsize=30)
plt.ylabel('True label', fontsize=25)
plt.xlabel('Predict label', fontsize=25)
plt.show()
其结果如下:
具体的各类解释可以在网上找到许许多多,本文不作详细解释,给出大致的代码参考,遇到不懂的再去调查学习,最后记录,成长。