介绍
在机器学习实战时,如果面对一个数据集具有上千个特征,那么对于模型训练将是一个巨大的挑战。面对如此多的数据变量,如果我们认真的去分析每一个变量将耗费我们几周甚至几个月的时间,那么你估计也要被开除了。因此我们需要一个更好的方法能够帮助我们在高维数据中筛选出对我们有用的变量,减小计算复杂度提高模型训练效率和准确率,这就是我们要说的降维。
降维分析
在网络时代,每天都要产生巨大数量的数据,事实上,世界上近90%的数据是近3年来产生的。我们通过几个例子来看数据的爆炸式增长:Facebook收集用户的爱好、参观的地方、分享的东西以及喜欢的餐馆数据
智能手机应用软件收集你的个人信息数据
Amazon收集你在网站浏览、点击、购买的商品信息等等
在如此数量级的数据中如何将数据可视化以及挖掘数据的内在信息价值将成为一个重要的问题。最常用的数据可视化方法就是图表,假设我们有身高和年龄2个变量,我们可以在二维坐标系中使用散点图或者折线图表示它们的关系:
那么如果我们有100个变量,我们就需要100x(100-1)/2幅图才能表示出其中两个变量之间的关系。这是非常不切实际的。更聪明的做法是挑选出其中更有价值的变量来研究它们的关系。比如说像下面这幅图
在图中有两个关于体重的变量,x1是kg,x2是英镑,这两个变量都表示一个人的体重信息,那么我们就可以选取其中一个作为我们要使用的变量即可,这样就将二维变成了一维。
同样的,在高维数据中我们同样可以去掉或者转化其中的变量来减少维度。
降维的好处减小数据维度和需要的存储空间
节约模型训练计算时间
去掉冗余变量,提高算法的准确度
有利于数据可视化
几种常用的降维方法
一、缺失值比例
当获得一个新的数据集,在建立模型之前我们需要分析数据,查看数据信息。当我们发现数据中有缺失值时,我们就要分析这个变量产生缺失值的原因以便于我们补齐还是丢弃这个变量。通常我们会设置一个阈值,如果缺失值比率超过阈值,则变量中有用信息较少,我们就丢弃这个变量;如果缺失值比率小于阈值,则保留这个变量,并用一些方法去弥补缺失值;
代码示例
# import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# read the data
train=pd.read_csv("Train_UWu5bXk.csv")
# checking the percentage of missing values in each variable
train.isnull().sum()/len(train)*100
# saving missing values in a variable
a = train.isnull().sum()/len(train)*100
# saving column names in a variable
variables = train.columns
variable = [ ]
for i in range(0,12):
if a[i]<=20: #setting the threshold as 20%
variable.append(variables[i])
二、低方差滤波器
如果在我们的数据集中有一个变量其值全是1,如果我们使用这个变量将不会对我们的模型有一定的提升,因此我们舍弃这个变量。由此我们可以看到如果一个变量数据间方差过小,说明变量包含的信息较少,就像上面这个例子,方差为0,数据间没有差异。所以在降维时,我们可以考虑先使用中位数弥补缺失值,然后计算变量相应的方差,通过过滤方差来达到我们降维的效果。
代码示例
# import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# read the data
train=pd.read_csv("Train_UWu5bXk.csv")
# impute the missing values by using the median value
train['Item_Weight'].fillna(train['Item_Weight'].median, inplace=True)
train['Outlet_Size'].fillna(train['Outlet_Size'].mode()[0], inplace=True)
train.isnull().sum()/len(train)*100
#calculate the variance
train.var()
numeric = train[['Item_Weight', 'Item_Visibility', 'Item_MRP', 'Outlet_Establishment_Year']]
var = numeric.var()
numeric = numeric.columns
variable = [ ]
for i in range(0,len(var)):
if var[i]>=10: #setting the threshold as 10%
variable.append(numeric[i+1])
三、高相关性滤波器
如果两个变量相关性较高说明其具有相似的变化趋势且可能包含相似的信息。因此我们可以计算数据集中的各变量间的相关性,设置相关性阈值,超过阈值即舍弃其中一个变量。
代码示例
# import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# read the data
train=pd.read_csv("Train_UWu5bXk.csv")
df=train.drop('Item_Outlet_Sales', 1)
df.corr()
四、随机森林
随机森林是一个广泛使用的特征选择算法,该算法可以计算出每个特征变量的重要性,从而我们可以舍弃重要性低的变量达到将为的目的。
代码示例
# import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import SelectFromModel
# read the data
train=pd.read_csv("Train_UWu5bXk.csv")
df=df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1)
model = RandomForestRegressor(random_state=1, max_depth=10)
df=pd.get_dummies(df)
model.fit(df,train.Item_Outlet_Sales)
#plot the feature importance graph
features = df.columns
importances = model.feature_importances_
indices = np.argsort(importances)[-9:] # top 10 features
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances[indices], color='b', align='center')
plt.yticks(range(len(indices)), [features[i] for i in indices])
plt.xlabel('Relative Importance')
plt.show()
# use the SelectFromModel to selects the features
feature = SelectFromModel(model)
Fit = feature.fit_transform(df, train.Item_Outlet_Sales)
五、反向特征消除
反向特征消除先将所有变量用于模型训练,然后在分别去掉其中一个变量再进行训练,如果训练的效果好则舍弃该变量。该方法一般用于构造线性回归或者Logistic回归。
代码示例
from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFE
from sklearn import datasets
lreg = LinearRegression()
rfe = RFE(lreg, 10)
rfe = rfe.fit_transform(df, train.Item_Outlet_Sales)
六、PCA
PCA即主成分分析,通过在原始样本变量中选取一些变量来代表样本的大部分信息。这些选中的变量即为主成分。我们可以调用sklearn中的PCA函数来进行数据主成分分析。
代码示例
from sklearn.decomposition import PCA
pca = PCA(n_components=4)
pca_result = pca.fit_transform(df[feat_cols].values)
七、独立成分分析
独立成分分析法(ICA)是基于信息理论的一种常用的降维方法,其与PCA主要的不同是PCA是寻找不相关的变量,而ICA是挑选独立变量。同时PCA主要对于高斯分布数据比较有效,而ICA适用于其他分布。我们可以调用sklearn中的FastICA函数来进行数据独立成分分析。
代码示例
from sklearn.decomposition import FastICA
ICA = FastICA(n_components=3, random_state=12)
X=ICA.fit_transform(df[feat_cols].values)
结语:
在本文中我们总结了机器学习中常用的数据降维方法,并用python将算法实现,数据降维对数据挖掘和模型训练具有重要的意义,可以减小模型训练时间提高训练效率。更多机器学习算法的学习欢迎关注我们。对机器学习感兴趣的同学欢迎大家转发&转载本公众号文章,让更多学习机器学习的伙伴加入微信公众号《python练手项目实战》,在实战中成长。