当前位置: 首页 > news >正文

特征提取(Feature Extraction)特征评估(五)

        下面我们将通过一个具体的代码实例来演示特征评估的过程。我们使用经典的“泰坦尼克号生存预测”数据集作为示例,通过特征重要性分析、递归特征消除(RFE)、基于模型的方法(例如:随机森林的重要性评分和SHAP值)来评估特征。

1. 导入必要的库

首先,我们需要导入必要的Python库:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import RFE
from sklearn.metrics import accuracy_score, classification_report, confusion_matriximport shap

2. 加载和预处理数据

我们将使用Pandas来加载数据,并进行必要的预处理,包括处理缺失值和编码类别型变量。

# 加载数据集
url = 'https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'
data = pd.read_csv(url)# 简单的数据预处理
# 填补年龄中的缺失值
data['Age'].fillna(data['Age'].median(), inplace=True)# 填补登船港口中的缺失值
data['Embarked'].fillna(data['Embarked'].mode()[0], inplace=True)# 删除不必要的列
data.drop(['Cabin', 'Ticket', 'Name'], axis=1, inplace=True)# 显示数据集的前几行
print(data.head())

3. 特征和目标变量

我们将“Survived”列作为目标变量,其他列作为特征。

# 定义特征和目标变量
X = data.drop('Survived', axis=1)
y = data['Survived']

4. 特征编码和标准化

我们使用ColumnTransformerPipeline来处理数值型和类别型特征。

# 数值型和类别型特征
numeric_features = ['Age', 'Fare', 'SibSp', 'Parch']
categorical_features = ['Pclass', 'Sex', 'Embarked']# 创建预处理器:数值特征标准化,类别特征One-Hot编码
preprocessor = ColumnTransformer(transformers=[('num', StandardScaler(), numeric_features),('cat', OneHotEncoder(), categorical_features)])# 构建预处理和模型的Pipeline
model = Pipeline(steps=[('preprocessor', preprocessor),('classifier', RandomForestClassifier(random_state=42))])

5. 特征重要性分析

首先,我们使用随机森林来评估特征的重要性。

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练模型
model.fit(X_train, y_train)# 提取特征名(包括One-Hot编码后的)
feature_names = numeric_features + list(model.named_steps['preprocessor'].transformers_[1][1].get_feature_names_out(categorical_features))# 获取特征重要性
importances = model.named_steps['classifier'].feature_importances_# 创建特征重要性DataFrame
feature_importances = pd.DataFrame({'Feature': feature_names, 'Importance': importances})
feature_importances = feature_importances.sort_values(by='Importance', ascending=False)# 可视化特征重要性
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=feature_importances)
plt.title('Feature Importance')
plt.show()

6. 递归特征消除(RFE)

我们将使用RFE来评估和选择最重要的特征。

# 使用逻辑回归作为基模型进行RFE
rfe_model = RFE(estimator=LogisticRegression(), n_features_to_select=5, step=1)
rfe_model = Pipeline(steps=[('preprocessor', preprocessor),('selector', rfe_model)])# 训练RFE模型
rfe_model.fit(X_train, y_train)# 获取选择的特征
selected_features = np.array(feature_names)[rfe_model.named_steps['selector'].support_]# 打印选择的特征
print("Selected Features by RFE:")
print(selected_features)

7. 使用SHAP值评估特征

SHAP值可以帮助我们理解每个特征如何影响模型的预测。

# 创建SHAP解释器
explainer = shap.TreeExplainer(model.named_steps['classifier'])# 对测试集进行预测
X_test_preprocessed = model.named_steps['preprocessor'].transform(X_test)# 计算SHAP值
shap_values = explainer.shap_values(X_test_preprocessed)# 可视化SHAP值
shap.summary_plot(shap_values[1], X_test_preprocessed, feature_names=feature_names)

8. 模型评估

最后,我们评估模型在测试集上的表现。

# 在测试集上进行预测
y_pred = model.predict(X_test)# 打印分类报告
print("Classification Report:")
print(classification_report(y_test, y_pred))# 显示混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

相关文章:

  • 【Linux】The server quit without updating PID file的几种解决方案
  • ubuntu20.04设置文件开机自启动
  • 持续总结中!2024年面试必问 20 道分布式、微服务面试题(二)
  • ffmpeg视频编码原理和实战-(2)视频帧的创建和编码packet压缩
  • 6.4分享会
  • 2024全国高考作文题解读(Chat GPT 4.0版本)
  • 讯方618代表有话说 | 行业大咖详解鸿蒙,全程在线答疑
  • java static 如何理解
  • Edge 工作区是什么?它都有哪些作用?
  • 删除目录
  • 【Android Studio】导入import android.support.v7.app.AppcompatActivity;时报错
  • 【机器学习】原理与应用场景 Python代码展现
  • 「前端+鸿蒙」鸿蒙应用开发简介
  • day26-单元测试
  • Vue3实战笔记(56)—实战:DefineModel的使用方法细节
  • 《Java编程思想》读书笔记-对象导论
  • axios 和 cookie 的那些事
  • Centos6.8 使用rpm安装mysql5.7
  • CSS 提示工具(Tooltip)
  • javascript 总结(常用工具类的封装)
  • php面试题 汇集2
  • SpringBoot 实战 (三) | 配置文件详解
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • windows下如何用phpstorm同步测试服务器
  • 多线程 start 和 run 方法到底有什么区别?
  • 服务器之间,相同帐号,实现免密钥登录
  • 实现简单的正则表达式引擎
  • 线性表及其算法(java实现)
  • 主流的CSS水平和垂直居中技术大全
  • 《码出高效》学习笔记与书中错误记录
  • MyCAT水平分库
  • #VERDI# 关于如何查看FSM状态机的方法
  • #Z2294. 打印树的直径
  • $jQuery 重写Alert样式方法
  • (1)svelte 教程:hello world
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Ruby)Ubuntu12.04安装Rails环境
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (办公)springboot配置aop处理请求.
  • (不用互三)AI绘画工具应该如何选择
  • (纯JS)图片裁剪
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)EOS中账户、钱包和密钥的关系
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .NET Core Web APi类库如何内嵌运行?
  • .net 发送邮件
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET建议使用的大小写命名原则