赞
踩
在机器学习项目中,特征选择是一个不可或缺的步骤,它不仅能够提高模型的预测性能,还能减少模型训练所需的计算资源和时间。本文将深入探讨特征排名的重要性和实现方法,涵盖数据清洁、可视化分析、递归特征消除法(RFE)、基于线性模型的特征系数分析以及随机森林的特征重要性评估。
在开始任何机器学习项目之前,首先需要对数据集进行全面了解。这包括数据清洁和可视化分析两个步骤。数据清洁主要是指识别并处理缺失值、异常值和重复数据。而可视化分析则通过绘制散点图、直方图和箱线图等,帮助我们从直观上了解数据分布和变量间的关系。
使用scikit-learn
库中的LabelEncoder
类和pandas
库来处理数据。LabelEncoder
是一个用于将标签标准化的工具,它可以将类别型标签转换为从0开始的数字序列,这对于机器学习模型的训练非常有用,因为许多模型需要输入数据是数值型的。
- from sklearn.preprocessing import LabelEncoder
- import pandas as pd
-
-
- data = pd.read_csv("data.csv")
- data.head()
-
- # 初始化LabelEncoder
- le = LabelEncoder()
-
- # 遍历DataFrame的每一列
- for column in data.columns:
- # 如果列的数据类型是object (通常用于表示字符串)
- if data[column].dtype == 'object':
- # 使用LabelEncoder转换字符串为数字
- data[column] = le.fit_transform(data[column])
这段代码的主要作用是:遍历data这个DataFrame的所有列,检查每一列的数据类型是否为object(字符串类型)。如果是,就使用LabelEncoder将该列的所有非数值型标签转换为数值型标签。这样处理后,所有原本为字符串的列都会被转换为含有整数的列,这对于后续的数据分析和机器学习模型的训练非常有帮助。
使用seaborn
(通常简写为sns
)库来创建一个对数据集中特定列的成对关系进行可视化的图表。seaborn
是一个基于matplotlib
的Python数据可视化库,提供了一个高级接口,用于制作统计图形。
- # 导入seaborn库,并简写为sns
- import seaborn as sns
-
- # 使用sns的plotting_context管理图形的样式和字体大小
- with sns.plotting_context("notebook", font_scale=1.5):
- # 创建一个pairplot,对指定列进行成对关系的可视化
- # data[['Year_Birth','Education','MntWines','Income','Kidhome']]选择了DataFrame中的特定列
- # hue='Year_Birth'表示颜色的分类依据是“Year_Birth”列
- # palette='tab20'指定了使用的颜色板
- # size=6设定了图形的大小
- g = sns.pairplot(data[['Year_Birth','Education','MntWines','Income','Kidhome']],
- hue='Year_Birth', palette='tab20', size=6)
-
- # 设置图形中的x轴标签为空,即不显示x轴的标签
- g.set(xticklabels=[]);
这段代码的作用是生成一个pairplot(成对关系图),用以展现Year_Birth
、Education
、MntWines
、Income
、Kidhome
这些变量之间所有可能的双变量关系。图中每行和每列的头都是数据集中的一个变量名,图表的每个小图展示了行变量和列变量之间的关系。通过hue
参数,数据点将根据Year_Birth
列的值着色,以显示不同出生年份的数据点分布情况。此外,palette='tab20'
为这些点指定了一个20色的颜色板,size=6
设置了图表中每个小图的大小。最后,使用g.set(xticklabels=[])
来隐藏x轴的所有标签,使图表看起来更加简洁。
对数据集中的数值型特征进行皮尔逊相关系数的可视化分析。皮尔逊相关系数用于量化两个变量之间的线性关系的程度。
- # 创建一个空列表,用于存放数据类型为字符串的列名
- str_list = []
- # 遍历DataFrame中的每一列
- for colname, colvalue in data.iteritems():
- # 如果列的第一个元素的类型是字符串
- if type(colvalue[1]) == str:
- # 将这个列名添加到str_list中
- str_list.append(colname)
-
- # 从data的所有列名中剔除str_list中的列名,即剔除所有字符串类型的列,留下数值型的列
- num_list = data.columns.difference(str_list)
- # 使用剩下的列名创建一个新的DataFrame,只包含数值型数据
- data_num = data[num_list]
-
- # 创建一个16x12英寸的图形
- f, ax = plt.subplots(figsize=(16, 12))
- # 设置图形的标题
- plt.title('Pearson Correlation of features')
-
- # 使用seaborn的heatmap函数创建热力图,这里使用data_num的相关系数矩阵
- # corr()函数计算DataFrame中所有列的成对相关系数
- # linewidths设置热力图内部线的宽度,vmax设置热力图颜色条的最大值
- # square参数使每个热图单元格成正方形,cmap设置热力图的颜色方案
- # linecolor设置热力图内部线条的颜色,annot=True显示每个单元格的数据值
- sns.heatmap(data_num.astype(float).corr(), linewidths=0.25, vmax=1.0, square=True, cmap="viridis", linecolor='k', annot=True)
这段代码的作用是通过热力图展示数据集中数值型特征之间的皮尔逊相关系数。首先,代码识别出所有的字符串类型列并将它们存储在一个列表中。然后,利用difference
方法从所有列中剔除这些字符串类型的列,保留数值型列。接下来,创建一个新的DataFramedata_num
,仅包含数值型数据,用于计算相关系数矩阵。
准备机器学习模型的输入和输出数据。它首先从数据集中移除含有空值的行,然后分离特征(X)和目标变量(Y)。最后,它从数据集中移除目标变量列,并记录剩下的特征名称。
- # 移除数据集中的所有含有空值的行,以确保数据的完整性
- data = data.dropna()
-
- # 将目标变量'Response'的值赋给Y,.values将其转换为数组形式
- Y = data.Response.values
-
- # 从数据集中移除'Response'列,axis=1指定了要移除的是列而非行
- data = data.drop(['Response'], axis=1)
-
- # 将剩下的数据集转换为数组形式,这将用作模型的特征输入
- X = data.values
-
- # 记录剩下的列名,这些列名对应于模型的特征
- colnames = data.columns
这段代码通常是数据预处理步骤的一部分,目的是为机器学习模型训练准备数据。通过移除空值和分离特征与目标变量,确保了模型能够接受完整且格式正确的数据。Y变量包含了模型需要预测的目标(响应变量),而X包含了用于进行预测的特征数据。最后,colnames保存了特征的名称,这在后续分析特征重要性或解释模型预测时非常有用。
定义一个用于特征排名的函数,旨在将特征按其重要性进行排序,并将这些排名标准化到0和1之间。
- # 导入MinMaxScaler,这是一个用于将特征缩放到给定范围(默认为0到1)的工具
- from sklearn.preprocessing import MinMaxScaler
-
- # 初始化一个字典用于存储特征的排名
- ranks = {}
-
- # 定义一个函数,该函数接收一个字典(ranks),一个包含特征名的列表(names)和一个排序顺序(order)
- def ranking(ranks, names, order=1):
- # 创建MinMaxScaler对象
- minmax = MinMaxScaler()
- # 将ranks转换为numpy数组,并根据order参数调整其排序方向
- # np.array([ranks])创建了一个二维数组,乘以order可能会反转其排序方向
- # 使用fit_transform对这些排名进行缩放,使其值在0和1之间
- # 最终,.T[0]将数组转回一维
- ranks = minmax.fit_transform(order*np.array([ranks]).T).T[0]
- # 使用map函数对每个排名进行四舍五入到两位小数
- ranks = map(lambda x: round(x,2), ranks)
- # 使用zip函数将特征名(names)和对应的排名(ranks)打包为元组列表,然后转换为字典
- return dict(zip(names, ranks))
递归特征消除(RFE)是一种基于模型的特征选择方法。它通过递归减少特征集的规模来找出最重要的特征。具体操作时,首先训练一个模型,然后移除最不重要的特征(即权重最低的特征),在剩余特征上重新训练模型,如此重复直到达到指定的特征数量。通过使用基础线性回归模型实施RFE,我们可以有效评估和排名特征的重要性。
- # 导入LinearRegression和RFE模块
- from sklearn.linear_model import LinearRegression
- from sklearn.feature_selection import RFE
-
- # 构造线性回归模型
- lr = LinearRegression()
- # 使用X和Y(特征和目标变量)来训练模型
- lr.fit(X,Y)
-
- # 初始化RFE模型,指定使用的外部估计器为上面创建的线性回归模型(lr)
- # n_features_to_select=1表示我们希望最终选择的特征数量为1
- # verbose=3表示模型在运行时会打印出详细信息
- rfe = RFE(lr, n_features_to_select=1, verbose=3)
- # 对X和Y进行RFE拟合
- rfe.fit(X,Y)
-
- # 使用前面定义的ranking函数来获取特征的排名
- # rfe.ranking_提供了特征的排名信息,通过map(float, rfe.ranking_)将排名转换为浮点数列表
- # 然后,这个列表和列名(colnames)一起传递给ranking函数
- # order=-1意味着我们希望排名越小(即越接近1)的特征越重要
- ranks["RFE"] = ranking(list(map(float, rfe.ranking_)), colnames, order=-1)
输出为:
- Fitting estimator with 27 features.
- Fitting estimator with 26 features.
- Fitting estimator with 25 features.
- Fitting estimator with 24 features.
- Fitting estimator with 23 features.
- Fitting estimator with 22 features.
- Fitting estimator with 21 features.
- Fitting estimator with 20 features.
- Fitting estimator with 19 features.
- Fitting estimator with 18 features.
- Fitting estimator with 17 features.
- Fitting estimator with 16 features.
- Fitting estimator with 15 features.
- Fitting estimator with 14 features.
- Fitting estimator with 13 features.
- Fitting estimator with 12 features.
- Fitting estimator with 11 features.
- Fitting estimator with 10 features.
- Fitting estimator with 9 features.
- Fitting estimator with 8 features.
- Fitting estimator with 7 features.
- Fitting estimator with 6 features.
- Fitting estimator with 5 features.
- Fitting estimator with 4 features.
- Fitting estimator with 3 features.
- Fitting estimator with 2 features.
线性模型是解释变量与响应变量线性关系的模型,如线性回归、Lasso回归和Ridge回归。在Sklearn库中,这些模型都有一个共通的特性——可以直接访问模型的系数(coef_),这些系数代表了各个特征对模型预测的影响程度。通过分析这些系数,我们可以获得对特征重要性的直观理解,并据此进行特征选择。
使用三种不同的线性模型:线性回归(Linear Regression)、岭回归(Ridge Regression)和套索回归(Lasso Regression)来评估特征的重要性,并使用之前定义的ranking
函数来对特征的重要性进行排序和标准化。每种模型都基于它们的系数来评估特征的重要性,不同的是,岭回归和套索回归通过添加惩罚项来限制模型系数的大小,有助于处理多重共线性问题和过拟合。
- # 导入必要的库
- from sklearn.linear_model import LinearRegression, Ridge, Lasso
- import numpy as np
-
- # 使用线性回归模型
- lr = LinearRegression()
- lr.fit(X, Y)
- # 计算每个特征的系数的绝对值,使用绝对值是因为系数的正负仅表示方向,其大小表示重要性
- # 使用前面定义的ranking函数对系数进行排序和标准化
- ranks["LinReg"] = ranking(np.abs(lr.coef_), colnames)
-
- # 使用岭回归模型,指定alpha=7作为正则化强度
- ridge = Ridge(alpha=7)
- ridge.fit(X, Y)
- # 同样计算系数的绝对值,并进行排序和标准化
- ranks['Ridge'] = ranking(np.abs(ridge.coef_), colnames)
-
- # 使用套索回归模型,指定alpha=0.05作为正则化强度
- lasso = Lasso(alpha=.05)
- lasso.fit(X, Y)
- # 计算系数的绝对值,并进行排序和标准化
- ranks["Lasso"] = ranking(np.abs(lasso.coef_), colnames)
这段代码通过三种不同的线性模型来评估特征的重要性,其中:
通过这种方法,可以得到每个特征在不同模型下的重要性排名,有助于理解哪些特征对模型预测能力贡献最大。
除了线性模型外,随机森林也是一个非常强大的工具,用于特征的重要性评估。随机森林是由多个决策树组成的集成学习模型,它可以提供每个特征在决策树中的平均不纯度减少(即feature_importances_属性),这是衡量特征重要性的有效方法。通过随机森林模型,我们不仅可以获得对数据的深入理解,还可以基于特征的重要性进行有效的特征选择。
使用随机森林回归(Random Forest Regressor)模型来评估特征的重要性。随机森林是一种集成学习方法,它通过构建多个决策树并汇总它们的预测结果来提高预测的准确性和稳定性。它特别适用于处理非线性关系和高维数据。在这段代码中,随机森林模型被用来拟合特征X和目标变量Y,并计算每个特征的重要性。然后,使用之前定义的ranking
函数对特征的重要性进行排序和标准化。
- # 导入随机森林回归模型
- from sklearn.ensemble import RandomForestRegressor
-
- # 初始化随机森林回归器,设置n_jobs=-1允许模型使用所有的CPU核心,
- # n_estimators=50设置决策树的数量为50,
- # verbose=3表示打印出详细的模型训练信息以帮助调试或了解模型训练过程
- rf = RandomForestRegressor(n_jobs=-1, n_estimators=50, verbose=3)
-
- # 使用特征X和目标变量Y训练随机森林模型
- rf.fit(X, Y)
-
- # 使用模型计算的特征重要性,这些重要性得分反映了每个特征在随机森林模型中的相对重要性
- # feature_importances_属性给出了每个特征的重要性得分
- # 然后调用之前定义的ranking函数,将特征重要性得分和对应的特征名称传递给该函数进行排序和标准化
- ranks["RF"] = ranking(rf.feature_importances_, colnames);
这段代码使用了随机森林回归(Random Forest Regressor)模型来评估特征的重要性。随机森林是一种集成学习方法,它通过构建多个决策树并汇总它们的预测结果来提高预测的准确性和稳定性。它特别适用于处理非线性关系和高维数据。在这段代码中,随机森林模型被用来拟合特征X和目标变量Y,并计算每个特征的重要性。然后,使用之前定义的ranking
函数对特征的重要性进行排序和标准化。下面是详细的解释和中文注释:
- pythonCopy code
- # 导入随机森林回归模型
- from sklearn.ensemble import RandomForestRegressor
-
- # 初始化随机森林回归器,设置n_jobs=-1允许模型使用所有的CPU核心,
- # n_estimators=50设置决策树的数量为50,
- # verbose=3表示打印出详细的模型训练信息以帮助调试或了解模型训练过程
- rf = RandomForestRegressor(n_jobs=-1, n_estimators=50, verbose=3)
-
- # 使用特征X和目标变量Y训练随机森林模型
- rf.fit(X, Y)
-
- # 使用模型计算的特征重要性,这些重要性得分反映了每个特征在随机森林模型中的相对重要性
- # feature_importances_属性给出了每个特征的重要性得分
- # 然后调用之前定义的ranking函数,将特征重要性得分和对应的特征名称传递给该函数进行排序和标准化
- ranks["RF"] = ranking(rf.feature_importances_, colnames);
在这里,rf.feature_importances_
提供了一个数组,其中包含了随机森林中所有特征的重要性得分,这些得分反映了每个特征在随机森林模型预测中的相对贡献大小。通过ranking
函数的应用,这些重要性得分被转化为一个标准化的格式,使得不同特征的重要性可以直观地进行比较。
- # 导入pandas库
- import pandas as pd
-
- # 假设ranks字典包含了特征的名称和它们的平均排名
- # 首先将ranks字典转换为列表,列表的每个元素是一个包含特征名称和平均排名的元组
- # 然后使用这个列表创建一个Pandas DataFrame,列名分别是'Feature'和'Mean Ranking'
- meanplot = pd.DataFrame(list(ranks.items()), columns= ['Feature','Mean Ranking'])
-
- # 对DataFrame进行排序,按'Mean Ranking'列的值降序排列
- # ascending=False表示降序,即排名高(数值大)的特征将排在前面
- meanplot = meanplot.sort_values('Mean Ranking', ascending=False)
- sns.catplot(x="Mean Ranking", y="Feature", data = meanplot, kind="bar", aspect=1.9, palet
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。