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

基于python的机器学习(七)—— 数据特征选择

目录

一、特征选择概念

二、特征选择的方法

2.1 过滤式特征选择

2.1.1 方差分析

2.1.2 相关系数

2.1.3 卡方检验

2.2 包裹式特征选择

2.2.1 递归特征消除

2.3 嵌入式特征选择

2.3.1 决策树特征重要性


一、特征选择概念

特征选择是机器学习非常重要的一个步骤,它指的是从原始数据中选择最相关的特征,以用于训练模型和预测。通过特征选择,可以提高模型的性能、减少过拟合、降低计算复杂度。

下面是使用随机森林进行特征选择的示例代码:

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification# 创建一个样本数据集
X, y = make_classification(n_samples = 1000, n_features = 20, n_informative = 10, random_state = 0)# 使用随机森林进行特征选择
clf = RandomForestClassifier()
clf.fit(X, y)# 输出特征重要性
feature_importances = clf.feature_importances_
print("Feature importances:\n", feature_importances)# 选择重要性大于阈值的特征
selected_features = [i for i, importance in enumerate(feature_importances) if importance > 0.05]
print("Selected features:\n", selected_features)

二、特征选择的方法

特征选择的方法主要分为三类:过滤式特征选择、包裹式特征选择和嵌入式特征选择。

2.1 过滤式特征选择

过滤式特征选择是在特征选择和模型训练之前独立进行的,它基于特征之间的统计指标或特征和目标变量之间的相关性来评估特征的重要性。常用的过滤方法包括方差分析、相关系数、卡方检验等。这种方法的优势在于计算简单快速,适用于大规模数据集,但可能忽略了特征之间的相互关系。

2.1.1 方差分析

方差分析用于比较两个或多个组之间的平均值是否有显著差异。在特征选择中,可以利用方差分析来评估不同特征对目标变量的影响程度。

from scipy import stats# 示例数据
group1 = [10, 20, 30, 40, 50]
group2 = [15, 25, 35, 45, 55]
group3 = [5, 15, 25, 35, 45]# 进行方差分析
f_statistic, p_value = stats.f_oneway(group1, group2, group3)if p_value < 0.05:print("均值之间存在显著差异")
else:print("均值之间不存在显著差异")

2.1.2 相关系数

相关系数用于衡量两个变量之间的线性相关性。在特征选择中,可以通过计算特征与目标变量之间的相关系数来筛选与目标变量相关性高的特征。

import pandas as pd# 示例数据
data = {'feature1': [1, 2, 3, 4, 5],'feature2': [2, 4, 6, 8, 10],'target': [5, 10, 15, 20, 25]}df = pd.DataFrame(data)# 计算特征与目标变量之间的相关系数
correlation = df.corr()['target']
print(correlation)

2.1.3 卡方检验

卡方检验适用于分类变量之间的关联性检验,用于判断两个分类变量之间是否存在显著关联。

在scikit-learn中提供了SelectKBest类, 是对卡方验证的实现,通过SelectKBest 使用一系列的统计方法来选定数据特征。

卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。

下面是通过卡方检验的方式来选择四个对结果影响最大的数据特征:(印地安人糖尿病数据集

from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2filename = 'Sklearn\pima_data.csv'          # 导入数据
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names = names)array = data.values
X = array[:, 0:8]       # 将数据分为输入数据和输出结果
Y = array[:, 8]test = SelectKBest(score_func = chi2, k = 4)    # 特征选定
fit = test.fit(X, Y)
set_printoptions(precision = 3)
print(fit.scores_)
features = fit.transform(X)
print(features)

2.2 包裹式特征选择

包裹式特征选择是在模型训练的过程中进行的,它直接利用模型的性能来评估特征的重要性。常见的包裹式方法包括递归特征消除(RFE)、基于模型的特征选择等。这种方法的优势在于考虑了特征之间的相互影响,但计算开销较大,不适用于大规模数据集。

2.2.1 递归特征消除

递归特征消除(RFE),使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。通过每一次基模型的精度,来找到对最终的预测结果影响最大的数据特征。在scikit-learn文档中有更多的关于递归特征消除(RFE)的描述。

下面是通过递归特征消除来选定对预测结果影响最大的三个数据特征:(印地安人糖尿病数据集

from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegressionfilename = 'Sklearn\pima_data.csv'        # 注意数据集的路径
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names = names)array = data.values
X = array[:, 0:8]
Y = array[:, 8]model = LogisticRegression()            # 特征选定
rfe = RFE(model, n_features_to_select = 3)
fit = rfe.fit(X, Y)print("特征个数:\n",fit.n_features_)
print("被选定的特征:\n",fit.support_)
print("特征排名:",fit.ranking_)

2.3 嵌入式特征选择

嵌入式特征选择是将特征选择嵌入到模型训练的过程中,常用的方法包括Lasso回归、决策树特征重要性等。这种方法可以同时考虑特征的重要性和模型的性能,得到的特征选择结果较为稳健。但是,嵌入式特征选择通常需要调节超参数,对模型的选择和调优有一定要求。

2.3.1 决策树特征重要性

决策树是一种常用的机器学习算法,除了用于预测和分类外,还可以用于特征选择。在决策树算法中,可以通过计算特征的重要性来衡量特征对模型预测的贡献程度,从而进行特征选择。

使用ExtraTreesClassifier类进行特征重要性计算,让算法给出每一个数据特征的得分:

from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifierfilename = 'Sklearn\pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names = names)array = data.values
X = array[:, 0:8]
Y = array[:, 8]model = ExtraTreesClassifier()
fit = model.fit(X, Y)
print(fit.feature_importances_)

相关文章:

  • (八)深度学习---计算机视觉基础
  • 大语言模型 16 - Manus 超强智能体 Prompt分析 原理分析 包含工具列表分析
  • 【notepad++如何设置成中文界面呢?】
  • 通信协议详解(分层技术解析)
  • vue3使用 Tailwind CSS (4.多版本)
  • Babylon.js学习之路《七、用户交互:鼠标点击、拖拽与射线检测》
  • OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市
  • pikachu靶场 暴力破解
  • 系统程序变更管理:确保IT环境稳定性和安全性的关键
  • 【东枫科技】usrp rfnoc 开发环境搭建
  • 【Java高阶面经:数据库篇】13. MySQL 并发控制秘籍:MVCC 协议与隔离级别深度解析
  • RAG 挑战赛冠军方案解析:从数据解析到多路由器检索的工程实践,推荐阅读!
  • 2025第一届轩辕杯--Crypto--WriteUp
  • [250521] DBeaver 25.0.5 发布:SQL 编辑器、导航器全面升级,新增 Kingbase 支持!
  • Android本地语音识别引擎深度对比与集成指南:Vosk vs SherpaOnnx
  • python代码绘制某只股票最近90天的K线图、均线、量能图
  • 线上 Linux 环境 MySQL 磁盘 IO 高负载深度排查与性能优化实战
  • CentOS 10:启动telnet服务
  • 网络爬虫(Web Crawler)详解
  • ​C++性能优化的7大核心策略与实战案例
  • 盐城网站推广电话/成都关键词优化服务
  • 做网站几个步骤/百度推广服务费一年多少钱
  • 凡科网做网站如何推广/搜索引擎优化seo的英文全称是
  • 网络营销网站建设流程/重庆seo网站推广费用
  • 网站域名改了以后新域名301/南京百度快速排名优化
  • 企业网站打包下载/网站访问量统计工具