大侠幸会幸会,我是日更万日 算法金;0 基础跨行转算法,国内外多个算法比赛 Top;放弃 BAT Offer,成功上岸 AI 研究院 Leader;
<随机森林及其应用领域> 随机森林是一种强大的机器学习算法,其基本原理在于通过集成多个决策树来提高整体性能。决策树是一种流程图结构,通过一系列的决策来达到最终目标。
而随机森林则是通过构建许多这样的决策树,每个决策树都在某种程度上是独立的,从而提高了模型的稳健性和准确性。这种算法在各种领域都有着广泛的应用。
防失联,进免费知识星球交流。算法知识直达星球:https://t.zsxq.com/ckSu3
- 项目实战 -
在接下来的部分,我们深入地探讨特征重要性在实际问题中的运用。我们将使用UCI红酒分类数据集,这个数据集来自UCI机器学习仓库,总共包含了3种红酒,178个样本。每个样本有13个特征,用于描述红酒的各种化学成分。https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data
<加载UCI红酒分类数据集>
数据集概览
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
加载数据集
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data"
column_names = ["Class", "Alcohol", "Malic acid", "Ash", "Alcalinity of ash", "Magnesium", "Total phenols", "Flavanoids", "Nonflavanoid phenols", "Proanthocyanins", "Color intensity", "Hue", "OD280/OD315 of diluted wines", "Proline"]
data = pd.read_csv('wine-1.csv', names=column_names)
分割数据集
X = data.drop("Class", axis=1)
y = data["Class"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
在这段代码的帮助下,我们不需要任何高超的技术,只需要几行简单的代码,就能将这些数据划分成可以训练机器学习模型的形式。
<训练随机森林模型>
构建随机森林模型
创建随机森林分类器
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
在训练集上训练模型
rf_classifier.fit(X_train, y_train)
训练完成后,评估模型
training_accuracy = rf_classifier.score(X_train, y_train)
print(f'训练集准确率:{training_accuracy:.2f}') # 评估训练集上的准确率
test_accuracy = rf_classifier.score(X_test, y_test)
print(f'测试集准确率:{test_accuracy:.2f}') # 评估测试集上的准确率
训练集准确率:1.00测试集准确率:1.0完美!
<查看特征重要性>
特征重要性的计算
决策树是通过计算每次特征划分导致的样本杂质(信息熵等)减少程度,来决定该特征的重要性。RandomForestClassifier会自动计算并存储特征重要性。
获取特征重要性
feature_importance = pd.DataFrame({"Feature": X_train.columns, "Importance": rf_classifier.featureimportances})
feature_importance = feature_importance.sort_values(by="Importance", ascending=False)
打印特征重要性
print(feature_importance)
<可视化特征重要性>
import numpy as np
import matplotlib.pyplot as plt
提取特征重要性信息
feature_names = X_train.columns
importances = rf_classifier.featureimportances
indices = np.argsort(importances)[::-1]
绘制条形图
plt.bar(range(X_train.shape[1]), importances[indices], align='center')
在每个条形图上显示特征重要性数值
for x in range(X_train.shape[1]):
text = '{:.2f}'.format(importances[indices[x]])
plt.text(x, importances[indices[x]] + 0.01, text, ha='center')
设置x轴刻度标签
plt.xticks(range(X_train.shape[1]), feature_names[indices], rotation=90)
plt.xlim([-1, X_train.shape[1]])
plt.ylim(0.0, np.max(importances) + 0.05)
添加标签和标题
plt.xlabel('Feature')
plt.ylabel('Importance')
plt.title('Random Forest Feature Importance')
自动调整布局并显示图形
plt.tight_layout()
plt.show()
<自动选择重要特征>
应用特征选择算法
from sklearn.feature_selection import SelectFromModel
使用SelectFromModel进行特征选择
sfm = SelectFromModel(rf_classifier, threshold='median') # 阈值可选,比如threshold=0.1
sfm.fit(X_train, y_train)
选出5个重要特征
X_train_selected = sfm.transform(X_train)
X_test_selected = sfm.transform(X_test)
查看选中的特征
selected_features = X_train.columns[sfm.get_support()]
重新建立模型并在选中特征上进行训练
rf_classifier_selected = RandomForestClassifier(n_estimators=100, random_state=42)
rf_classifier_selected.fit(X_train_selected, y_train)
在测试集上进行预测
y_pred_selected = rf_classifier_selected.predict(X_test_selected)
评估模型性能
accuracy_selected = accuracy_score(y_test, y_pred_selected)
打印选中的特征和模型评估结果
print("Selected Features:", list(selected_features))
print("Model Accuracy with Selected Features:", accuracy_selected)
自动选择了 7 个重要特征,其中脯氨酸和酒精含量位列前两。这与手动分析特征重要性的结果是一致的。通过运行可以发现,结果和13个特征的方法相当,Cool...
/ \ | |
| / \/ _ | |
| | / \ / _ | |
| \/\ () | () | |
_/\/ __/||
打完收工 [ 抱拳礼 ]星辰大海,江湖再会,溜了溜了~