||
各位亲们,这个代码非常有用,几乎每个人每天都在用。你们是不是想有种办法,从众多人群中挑选最如意的那位人。你综合考虑了这个人的自信力、意志力、学历、家庭背景、学校出生、出生地、鼻子、眼睛等诸多特征,现在的问题是如何通过这些特征挑选到你所需要的人。目标不同,特征的重要程度不同,比如你的目标是司机、科研、医生、配偶等等,那么选取的特征就不同。这里展示的代码是根据目标,选择需要考虑的最重要的特征,并把特征的前三项通过数据和图形展示出来。
机器学习中,我们需要从大量特征(机器学习中叫特征符)中挑选最重要的影响因素(the importances of the features),列出前三项(或者任何多项)。
我给大家提供了数据(附件是数据表,展现的是学生学生成绩的影响因素与成绩的数据),直接下载数据,把以下的程序拷贝到jupter notebook中,运行就可以。
#特征符中有非数值型数据时
import pandas as pd # 导入pandas库,用于数据处理和操作
import numpy as np # 导入numpy库,用于数值计算
from sklearn.ensemble import RandomForestRegressor # 导入随机森林回归器,用于构建回归模型
from sklearn.model_selection import train_test_split # 导入train_test_split函数,用于将数据集划分为训练集和测试集
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error # 导入评估指标,用于评估模型性能
from sklearn.preprocessing import OneHotEncoder # 导入OneHotEncoder,用于对分类特征进行独热编码
import matplotlib.pyplot as plt # 导入matplotlib库,用于绘制图表
# 读取Excel文件
data = pd.read_excel(r'student_data.xlsx') # 从指定路径读取Excel文件,存储为DataFrame对象
# 检查是否有缺失值
print(data.isnull().sum()) # 打印每一列中缺失值的数量,帮助我们了解数据的质量
# 分割特征和目标变量
X = data.drop(columns=['Score']) # 特征是除 'Score' 外的所有列
y = data['Score'] # 目标变量是 'Score' 列
# 检查非数值型特征
categorical_cols = X.select_dtypes(include=['object', 'category']).columns.tolist() # 获取所有非数值型特征的列名
if categorical_cols:
print(f"非数值型特征: {categorical_cols}") # 如果存在非数值型特征,打印它们的名称
else:
print("没有非数值型特征") # 如果没有非数值型特征,打印提示信息
# 对非数值型特征进行独热编码
if categorical_cols: # 如果存在非数值型特征
encoder = OneHotEncoder(sparse_output=False, handle_unknown='ignore') # 创建OneHotEncoder对象,确保输出为密集矩阵,并忽略未知类别
encoded_cols = pd.DataFrame(encoder.fit_transform(X[categorical_cols]), index=X.index) # 对非数值型特征进行独热编码,并将其转换为DataFrame
encoded_cols.columns = encoder.get_feature_names_out(categorical_cols) # 为编码后的特征设置新的列名
# 将编码后的特征与原始数值型特征合并
X_numeric = X.select_dtypes(exclude=['object', 'category']) # 获取所有数值型特征
X = pd.concat([X_numeric, encoded_cols], axis=1) # 将编码后的特征与数值型特征合并,形成新的特征矩阵
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 将数据集划分为训练集(80%)和测试集(20%),并设置随机种子以确保结果可复现
# 创建随机森林回归器
rf = RandomForestRegressor(n_estimators=100, random_state=42) # 创建一个随机森林回归器,使用100棵树,并设置随机种子以确保结果可复现
# 训练模型
rf.fit(X_train, y_train) # 使用训练集数据训练随机森林模型
# 获取特征重要性
importances = rf.feature_importances_ # 获取每个特征的重要性分数
feature_importances = pd.DataFrame({'Feature': X.columns, 'Importance': importances}) # 将特征名称和重要性分数组合成一个DataFrame
feature_importances = feature_importances.sort_values(by='Importance', ascending=False) # 按重要性分数降序排列
print(feature_importances) # 打印特征重要性
# 选择重要特征
selected_features = feature_importances[feature_importances['Importance'] > 0.05]['Feature'].tolist() # 选择重要性分数大于0.05的特征
# 使用选择的特征重新训练模型
X_train_selected = X_train[selected_features] # 从训练集中提取选定的特征
X_test_selected = X_test[selected_features] # 从测试集中提取选定的特征
rf_selected = RandomForestRegressor(n_estimators=100, random_state=42) # 创建一个新的随机森林回归器
rf_selected.fit(X_train_selected, y_train) # 使用选定的特征重新训练模型
# 预测并计算均方误差、R² 和 MAE
y_pred_selected = rf_selected.predict(X_test_selected) # 使用测试集进行预测
mse_selected = mean_squared_error(y_test, y_pred_selected) # 计算均方误差(MSE)
r2_selected = r2_score(y_test, y_pred_selected) # 计算决定系数(R²)
mae_selected = mean_absolute_error(y_test, y_pred_selected) # 计算平均绝对误差(MAE)
print(f'Mean Squared Error with selected features: {mse_selected}') # 打印MSE
print(f'R² Score with selected features: {r2_selected}') # 打印R²
print(f'Mean Absolute Error with selected features: {mae_selected}') # 打印MAE
print("Selected Features:") # 打印选定的特征
print(selected_features)
# 绘制特征重要性条形图
plt.figure(figsize=(10, 6)) # 设置图表大小
plt.barh(feature_importances['Feature'], feature_importances['Importance'], color='green') # 绘制水平条形图,显示特征重要性
# 在柱子上显示数值
for i, v in enumerate(feature_importances['Importance']):
plt.text(v + 0.01, i, f'{v:.2%}', va='center', color='black') # 在每个条形图旁边显示重要性分数(百分比格式)
# 设置标题居中
plt.title('Importance of Feature Parameters', loc='center') # 设置图表标题
plt.xlabel('Importance') # 设置x轴标签
plt.gca().invert_yaxis() # 从上到下排列条形图
plt.show() # 显示图表
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-21 23:59
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社