intellij idea使用教程 intellij idea下载 rest symfony servlets casting joomla bootstrap后台管理系统模板 linux环境变量生效 linux关闭mysql 查看rabbitmq版本 matlab复数求模 android自定义控件 python教学 mysql函数 python内置库 python基础语法 java中的tostring 搭建java开发环境 java中instanceof 猫爪 只狼脚本 idataparameter 多面硬币 win10有哪些版本 wegame更新失败 js代码混淆工具 万能播放器电脑版 逗号的作用 renderto 正则表达式替换 追评可以删除吗 淘宝退货怎么上门取件 chrome访问助手 rdpwrap zepto下载 骰子技巧 微信获取用户信息 百小度 正则表达式java
当前位置: 首页 > 学习教程  > python

基于模型的特征选取方法(LR、树模型、PCA)

2021/2/7 9:55:37 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

文章目录数据集加载和准备从系数获取特征重要性从树模型获取特征重要性从 PCA 分数中获取特征重要性数据集加载和准备 为了方便介绍,我这里使用"load_breast_cancer"数据集,该数据内置于 Scikit-Learn 中。 import numpy as np import panda…

文章目录

  • 数据集加载和准备
  • 从系数获取特征重要性
  • 从树模型获取特征重要性
  • 从 PCA 分数中获取特征重要性

数据集加载和准备

为了方便介绍,我这里使用"load_breast_cancer"数据集,该数据内置于 Scikit-Learn 中。

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
from matplotlib import rcParams
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

rcParams['figure.figsize'] = 14, 7
rcParams['axes.spines.top'] = False
rcParams['axes.spines.right'] = False

# 加载数据
data = load_breast_cancer()

df = pd.concat([pd.DataFrame(data.data, columns=data.feature_names), pd.DataFrame(data.target, columns=['y'])], axis=1)
print(df.head())

在这里插入图片描述
上述数据中有 30 个特征变量和一个目标变量。所有值都是数值,并且没有缺失的值。在解决缩放问题之前,还需要执行训练、测试拆分。

X = df.drop('y', axis=1)
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
ss = StandardScaler()
X_train_scaled = ss.fit_transform(X_train)
X_test_scaled = ss.transform(X_test)

从系数获取特征重要性

检查特征重要性的最简单方法是检查模型的系数。例如,线性回归和逻辑回归都归结为一个方程,其中将系数(重要性)分配给每个输入值。

简单地说,如果分配的系数是一个大(负或正)数字,它会对预测产生一些影响。相反,如果系数为零,则对预测没有任何影响。

逻辑非常简单,让我们来测试一下,逻辑回归是一种合适的算法。拟合模型后,系数将存储在属性中coef_。

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train_scaled, y_train)
importances = pd.DataFrame(data={
    'Attribute': X_train.columns,
    'Importance': model.coef_[0]
})
importances = importances.sort_values(by='Importance', ascending=False)
# 可视化
plt.bar(x=importances['Attribute'], height=importances['Importance'], color='#087E8B')
plt.title('Feature importances obtained from coefficients', size=20)
plt.xticks(rotation='vertical')
plt.show()

在这里插入图片描述
该方法最大特点:简单、高效。系数越大(在正方向和负方向),越影响预测效果。

从树模型获取特征重要性

训练任何树模型后,你都可以访问 feature_importances 属性。这是获取功特征重要性的最快方法之一。
这里用xgboost

from xgboost import XGBClassifier

model = XGBClassifier()
model.fit(X_train_scaled, y_train)
importances = pd.DataFrame(data={
    'Attribute': X_train.columns,
    'Importance': model.feature_importances_
})
importances = importances.sort_values(by='Importance', ascending=False)
# 可视化
plt.bar(x=importances['Attribute'], height=importances['Importance'], color='#087E8B')
plt.title('Feature importances obtained from coefficients', size=20)
plt.xticks(rotation='vertical')
plt.show()

在这里插入图片描述

从 PCA 分数中获取特征重要性

主成分分析(PCA)是一种出色的降维技术,也可用于确定特征的重要性。

PCA 不会像前两种技术那样直接显示最重要的特征。相反,它将返回 N 个主组件,其中 N 等于原始特征的数量。

from sklearn.decomposition import PCA
pca = PCA().fit(X_train_scaled)
# 可视化
plt.plot(pca.explained_variance_ratio_.cumsum(), lw=3, color='#087E8B')
plt.title('Cumulative explained variance by number of principal components', size=20)
plt.show()

在这里插入图片描述
但这是什么意思呢?这意味着你可以使用前五个主要组件解释源数据集中 90%的方差。同样,如果你不知道这意味着什么,继续往下看。

loadings = pd.DataFrame(
    data=pca.components_.T * np.sqrt(pca.explained_variance_), 
    columns=[f'PC{i}' for i in range(1, len(X_train.columns) + 1)],
    index=X_train.columns
)
loadings.head()

在这里插入图片描述
第一个主要组成部分至关重要。它只是一个要素,但它解释了数据集中超过 60% 的方差。从上图中可以看到,它与平均半径特征之间的相关系数接近 0.8,这被认为是强正相关。

让我们可视化所有输入要素与第一个主组件之间的相关性。下面是整个代码段(包括可视化):

pc1_loadings = loadings.sort_values(by='PC1', ascending=False)[['PC1']]
pc1_loadings = pc1_loadings.reset_index()
pc1_loadings.columns = ['Attribute', 'CorrelationWithPC1']

plt.bar(x=pc1_loadings['Attribute'], height=pc1_loadings['CorrelationWithPC1'], color='#087E8B')
plt.title('PCA loading scores (first principal component)', size=20)
plt.xticks(rotation='vertical')
plt.show()

在这里插入图片描述
原创不易,转载请注明出处


本文链接: http://www.dtmao.cc/news_show_2000210.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?