接上篇:
机器学习之特征工程(数据清洗)
import numpy as np
from scipy.stats import pearsonr
from sklearn.feature_selection import SelectKBest
from sklearn.datasets import load_digits
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame(load_digits().data)
data.columns = [f'x{i}' for i in range(1,65)]
data['y'] = load_digits().target
data.head(3)
思路:使用某种独立于数据挖掘任务的方法,在数据挖掘过程前进行特征提取,尽可能使特征之间的相关度较低。
from sklearn.feature_selection import VarianceThreshold
# 方差选择法,返回值为特征选择后的数据
# 参数threshold为方差的阈值
v = VarianceThreshold(threshold=30) # 指定方差大于30
vv = v.fit_transform(data.iloc[:,0:64]) # 拟合选取特征
vv.shape,v.get_support(),vv # 维度 是否为选取的特征 提取后的数据
# 方差大于30的特征含有21个
pears = data.corr(method='pearson', min_periods=1) # 相关系数
plt.figure(figsize=(8,6))
sns.heatmap(pears) # 相关系数热力图
from sklearn.feature_selection import SelectKBest # 生成一个特征提取器
from sklearn.feature_selection import f_regression # 提取特征方法
selectKBest = SelectKBest(f_regression, k=4) # 生成一个利用相关系数法,提取4个特征的选择器
bestFeature = selectKBest.fit_transform(data.iloc[:,0:64], data[['y']]) # 拟合选取
selectKBest.get_support() # 输出bool值 提取出的特征为True
# 结果可以看出4个特征为:x13,x28,x36,x53 这四个特征与y值相关性较高
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2 # 卡方检验
#选择K个最好的特征,返回选择特征后的数据
ch = SelectKBest(chi2, k=5) # 生成选择器:利用卡方检验保留5个特征
chh = ch.fit_transform(data.iloc[:,0:64],data['y'])
chh.shape,ch.get_support(),chh
# 5个特征为 x34,x35,x43,x44,x55
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_regression
m = SelectKBest(mutual_info_regression,k=5)
mm = m.fit_transform(data.iloc[:,0:64],data['y'])
mm.shape,m.get_support(),mm
# 5个特征为x27,x31,x34,x35,x43
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
rfe = RFE(estimator = LinearRegression(), n_features_to_select=5)
RFE=rfe.fit_transform(data.iloc[:,0:64],data['y'])
RFE.shape,rfe.get_support(),RFE
正则化是一种回归的形式,它将回归系数估计朝零的方向进行约束、调整或缩小。也就是说,正则化可以在学习过程中降低模型复杂度和不稳定程度,从而避免过拟合的危险。正则化包含L1和L2正则化。例如:下面的公式是岭回归的损失函数,,而后面加的就是L2正则惩罚项, α \alpha α是权衡系数。L1正则化则是加的 θ \theta θ的绝对值之和。
正则化惩罚项越大,那么模型的系数就会越小。当正则化惩罚项增大到一定程度时,所有的特征系数都会趋于0, 而其中一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。也就是说,我们选择特征系数较大的特征。
from sklearn.feature_selection import SelectFromModel # 从模型中选择就用这个模块
from sklearn.linear_model import LogisticRegression # 逻辑回归模型
s = SelectFromModel(LogisticRegression(penalty="l2", C=0.1)) # L2正则化 惩罚项系数为0.1
ss = s.fit_transform(data.iloc[:,0:64],data['y'])
ss.shape # (1797, 38) 保留了38个特征
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestRegressor # 随机森林回归器
s = SelectFromModel(RandomForestRegressor(n_estimators=20, max_depth=4)) # 20棵树即决策树,深度为4
ss = s.fit_transform(data.iloc[:,0:64],data['y'])
ss.shape # (1797, 13)
看我之前的博客:机器学习之降维方法主成分分析与因子分析,详细介绍了PCA与因子分析的步骤原理及python如何实现降维的。
参考:
【机器学习】特征选择(Feature Selection)方法汇总
特征选择实践—python
《数据挖掘导论》[美] Michael Steinbach 著 范明 译