随机森林模型进⾏递归特征消除的python实现核⼼代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
ics import precision_score
ics import recall_score
ics import f1_score
semble import RandomForestClassifier
from sklearn.feature_selection import RFECV
# 省略了训练集,测试集的划分 x_train,y_train,x_test,y_test
'RandomForestClassifier 没有属性 coef,将RandomForestClassifier改进以适⽤于RFECV所做的⼯作'
class RandomForestClassifierWithCoef(RandomForestClassifier):
def fit(self, *args, **kwargs):
super(RandomForestClassifierWithCoef, self).fit(*args, **kwargs)
rf = RandomForestClassifierWithCoef(n_estimators=500, min_samples_leaf=5, n_jobs=-1)
rfecv = RFECV(estimator=rf, step=1, scoring='accuracy',cv=2)
selector = rfecv.fit(x_train, y_train)
print('RFECV 选择出的特征个数:' , rfecv.n_features_)  # RFECV选择的特征个数
print('特征优先级: ', rfecv.ranking_)        # 1代表选择的特征
x_train_rfecv = ansform(x_train)
x_test_rfecv = ansform(x_test)
# 随机森林
rf_clf = RandomForestClassifier(n_jobs=-1, max_depth=100, n_estimators=800)
rf_clf.fit(x_train_rfecv, y_train)
y_pred = rf_clf.predict(x_test_rfecv)
# 模型评价
p = precision_score(y_test, y_pred, average='macro')
r = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
print('precision : ' + str(p))
print('recall : ' + str(r))
print('f1 : ' + str(f1))
# 可视化
# 不同特征数量下的评分
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score ")
plt.plot(range(1, id_scores_) + 1), id_scores_)
plt.show()
运⾏结果:
特征总数 :  (150000, 21)
RFECV 选择出的特征个数 : 16
特征优先级 :  [1 4 1 1 1 1 1 3 1 1 1 1 1 2 1 1 1 1 1 5]
random pythonprecision : 0.8076859420407486
recall : 0.6387230994790538
f1 : 0.700276909593012

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。