aimeeli的个人博客分享 http://blog.sciencenet.cn/u/aimeeli

博文

python最简单快速挑选出最重要的特征符代码-有数据有代码

已有 339 次阅读 2024-12-6 08:31 |个人分类:自学魅力|系统分类:科研笔记

   各位亲们,这个代码非常有用,几乎每个人每天都在用。你们是不是想有种办法,从众多人群中挑选最如意的那位人。你综合考虑了这个人的自信力、意志力、学历、家庭背景、学校出生、出生地、鼻子、眼睛等诸多特征,现在的问题是如何通过这些特征挑选到你所需要的人。目标不同,特征的重要程度不同,比如你的目标是司机、科研、医生、配偶等等,那么选取的特征就不同。这里展示的代码是根据目标,选择需要考虑的最重要的特征,并把特征的前三项通过数据和图形展示出来。

机器学习中,我们需要从大量特征(机器学习中叫特征符)中挑选最重要的影响因素(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()  # 显示图表



https://blog.sciencenet.cn/blog-3383449-1463119.html

上一篇:python自动作图代码-比origin作图快十倍
收藏 IP: 58.48.30.*| 热度|

1 郑永军

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-21 23:59

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部