在Python中实现随机森林分类模型
随机森林算法用于分类和回归。随机森林是一种由多个决策树组成的集合学习方法。通过平均几棵决策树的影响,随机森林往往会改善预测。
有许多不同的模型可用于对分类数据进行预测。Logistic回归是二项数据中最常见的一种。其他方法包括支持向量机(“SVM”),朴素贝叶斯和k最近邻。随机森林倾向于在模型具有大量特征的情景中发挥作用,这些特征单独具有较弱的预测能力,但集体强大得多。
在本文中,我将为您提供一个关于如何在Python中为分类问题实现随机森林模型的快速指南。
加载数据
为了理解如何在Python中实现随机森林模型,我们将用皮马印第安人糖尿病数据集做一个非常简单的例子。你可以从很多来源找到它,或者你可以复制下面的代码。
import pandas as pd
# list for column headers
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
# open file with pd.read_csv
df = pd.read_csv("https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv", names=names)
print(df.shape)
# print head of data set
print(df.head())
虽然皮马印第安人糖尿病数据集不一定是最适合所有其他模型的随机森林数据的一个例子,但真正的目标是通过简单的数据集来实现模型的过程。
创建一个随机森林模型
让我们来创建我们的模型。我们试图预测患者是否患有糖尿病。这与“class”栏一致,这将成为我们的自变量。我们将使用所有其他列作为我们模型的特征。
X = df.drop(‘class’, axis=1)
y = df[‘class’]
我们将使用train-test-split将数据分解为训练数据和测试数据。
from sklearn.model_selection import train_test_split
# implementing train-test-split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=66)
现在,我们可以创建随机森林模型。
from sklearn import model_selection
# random forest model creation
rfc = RandomForestClassifier()
rfc.fit(X_train,y_train)
# predictions
rfc_predict = rfc.predict(X_test)
评估性能
我们将导入cross_val_score、classification_report和sion_matrix。
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report, confusion_matrix
我们还将运行交叉验证以更好地了解结果。
rfc_cv_score = cross_val_score(rfc, X, y, cv=10, scoring=’roc_auc’)
现在,我们将打印出结果。
print("=== Confusion Matrix ===")
print(confusion_matrix(y_test, rfc_predict))
print('')
print("=== Classification Report ===")
print(classification_report(y_test, rfc_predict))
print('')
print("=== All AUC Scores ===")
print(rfc_cv_score)
print('')
print("=== Mean AUC Score ===")
print("Mean AUC Score - Random Forest: ", rfc_cv_score.mean())
你应该得到一个如下所示的打印输出:
混淆矩阵对于给你假阳性和假阴性是有用的。分类报告告诉你模型的准确性。ROC曲线绘制出了不同阈值下的真阳性率和假阳性率。在交叉验证模型中使用的roc_auc评分显示ROC曲线下的面积。
我们将根据roc_auc评分来评估模型的分数,即.792。接下来我们要做的是调整我们的超参数,看看我们是否能提高模型的性能。
调优Hyperparameters
我们将从sklearn中使用随机搜索cv优化我们的超参数。我决定关注3个超参数:n_estimators、max_features和max_depth。
from sklearn.model_selection import RandomizedSearchCV
# Number of trees in random forest
n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]
# Number of features to consider at every split
max_features = [‘auto’, ‘sqrt’]
# Maximum number of levels in tree
# max_depth = [int(x) for x in np.linspace(10, 110, num = 11)]
max_depth = [int(x) for x in np.linspace(100, 500, num = 11)]
max_depth.append(None)
# Create the random grid
random_grid = {
‘n_estimators’: n_estimators,
‘max_features’: max_features,
‘max_depth’: max_depth
}
# Random search of parameters, using 3 fold cross validation,
# search across 100 different combinations, and use all available cores
rfc_random = RandomizedSearchCV(estimator = rfc, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=2, random_state=42, n_jobs = -1)
# Fit the random search model
rfc_random.fit(X_train, y_train)
print(rfc_random.best_params_)
这应该需要几分钟时间才能运行,底部的打印输出显示了我们模型的最佳超参数。
我的结果是:'n_estimators'= 600; 'max_features'='sqrt'; 'max_depth':300.现在我们可以将它们重新插入到模型中,以查看它是否改进了我们的性能。
rfc = RandomForestClassifier(n_estimators=600, max_depth=300, max_features='sqrt')
rfc.fit(X_train,y_train)
rfc_predict = rfc.predict(X_test)
rfc_cv_score = cross_val_score(rfc, X, y, cv=10, scoring='roc_auc')
print("=== Confusion Matrix ===")
print(confusion_matrix(y_test, rfc_predict))
print('')
print("=== Classification Report ===")
print(classification_report(y_test, rfc_predict))
print('')
print("=== All AUC Scores ===")
print(rfc_cv_score)
print('')
print("=== Mean AUC Score ===")
print("Mean AUC Score - Random Forest: ", rfc_cv_score.mean())
从输出中我们可以看到结果略有改善。我们的roc_auc得分从0.793提高到了.829。缺点是我们的假阳性数量略有增加(但假阴性降低)。