4大方法进行特征选择
特征选择能剔除和目标变量不相关(irrelevant)或冗余(redundant )的特征,以此来减少特征个数,以此来达到提高模型精确度,减少运行时间的目的。
另一方面,筛选出真正相关的特征之后也能够简化模型,经常听到的这段话足以说明特征工程以及特征选择的重要性:
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
本文记录的是使用4种不同的方法来进行机器学习中特征的重要性排序,从而比较不同特征对目标变量的影响。4种方法是:
- 递归特征消除
- 线性模型
- 随机森林
- 相关系数
导入库
In [1]:
1 | import pandas as pd |
导入数据
In [2]:
1 | house = pd.read_csv("kc_house_data.csv") |
Out[2]:
基本信息
In [3]:
1 | # 数据shape |
Out[3]:
1 | (21613, 21) |
In [4]:
1 |
|
Out[4]:
1 | id 0 |
In [5]:
1 | house.isnull().any() # 每个字段都没有缺失值 |
In [6]:
1 |
|
Out[6]:
1 | id int64 |
删除无用字段
id和date两个字段直接删除掉:
In [7]:
1 | house = house.drop(["id", "date"],axis=1) |
Pairplot Visualisation
Pairplot中的plot就是成对、配对的意思,这种图形主要是显示变量两两之间的关系。
线性、非线性或者没有明显的相关性,都能观察到。下面的例子教你如何查看不同特征之间的关系:
In [8]:
1 | fig = sns.pairplot(house[['sqft_lot','sqft_above','price','sqft_living','bedrooms']], |
属性相关性热力图
属性之间的相关性只是针对数值型的字段,在这里我们先排除字符串类型的属性。
In [9]:
1 |
In [10]:
1 |
在这里我们直接取出非字符类型的属性数据:
In [11]:
1 | house_num = house.select_dtypes(exclude="object") |
计算相关性和热力图:
1 | corr = house_num.astype(float).corr() |
下面是用对其他3种方式进行特征的重要性进行探索,先实施数据的分割
数据分离
In [14]:
1 | # 1、先提取目标变量 |
计算特征的重要性
1 | # 2、定义 |
基于RFE的特征排序
RFE:Recursive Feature Elimination,递归特征消除;
大致原理:通过反复地建立的线性回归或者SVM模型获得每个特征的coef_ 属性 或者 feature_importances_ 属性,并且对特征属性的重要性进行排序,从当前的特征集合中移除那些最不重要的特征,重复该过程。
Recursive Feature Elimination or RFE uses a model ( eg. linear Regression or SVM) to select either the best or worst-performing feature, and then excludes this feature
In [17]:
1 | lr = LinearRegression(normalize=True) |
上图显示的每个特征属性的得分;可以通过ranking_属性查看具体的排名:
基于线性模型的特征排序
下面尝试使用3种线性模型来进行特征排序
In [20]:
1 | # 1、线性回归 |
ranks中新增的部分数据:
基于随机森林RandomForest的特征排序
随机森林主要是通过返回模型中的feature_importances属性来决定特征的重要性程度
In [22]:
1 | rf = RandomForestRegressor(n_jobs=-1, |
构造特征排序矩阵
将上面我们获取的每种方法的特征及其得分构造一个特征排序矩阵
生成特征矩阵
In [23]:
1 | ranks_df = pd.DataFrame(ranks) |
最后把特征和目标变量的相关系数添加进来一起对比:
求出均值
求出所有方法下的均值:
In [27]:
1 | ranks_df["Mean"] = ranks_df.mean(axis=1) |
热力图显示
In [28]:
1 | import seaborn as sns |
Out[28]:
对比结果
- RFE的重要性分数取值整体是偏高的;前两位是waterfront、lat
- 三种回归模型的得分比较接近,而且前两位和RFE是类型。可能原因是RFE选择的基模型是线性回归
- 随机森林模型最终得到3个特征的分数是比较高的:grade、sqft_living、lat
- 基于相关系数:得分排序的结果和随机森林接近
最后看看Mean的排名:
1 | f = plt.figure(figsize=(12,8)) |