不是所有有价值的都能被计算,不是所有能计算的都有价值——爱因斯坦
2.特征选择
文章目录
收集的到的数据中包含丰富的信息,接着又使用特征构造方法增加了许多新特征,部分特征可能对目标的预测贡献度不高、关联度不高,或是噪声过大。特征选择就是特征工程的筛选环节。
按照特征的发散性或者相关性进行评分,常用的特征选择方法有:
- Filter:过滤法
- Wrapper:包装法
- Embedded:嵌入法
2.1 Filter:过滤法
2.1.1方差过滤法
计算各个特征的反差,设定阈值,根据阈值进行过滤。
from sklearn.feature_selection import VarianceThreshold
import numpy as np
#生成5行10列的矩阵
X = np.random.randn(5,10)
# 实例化对象,设置方差阈值为0.5,方差小于等于0.5的特征将被删除
vt = VarianceThreshold(threshold=0.5)
X1 = vt.fit_transform(X)
#过滤后保留的数据
print(X1)
2.1.2 Pearson相关系数
使用相关系数法,先要计算各个特征对预测目标值Pearson相关系数(P值)。结果的取值区间为[-1,1],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BshwSlgV-1662046097720)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c0f18baf28034ff98e16d0821ba1200c~tplv-k3u1fbpfcp-watermark.image?)]
from scipy.stats import pearsonr
from sklearn.datasets import load_iris
import numpy as np
iris = load_iris()
d = iris.data
#print(iris.feature_names)
#print(iris.data)
#对数据的每个特征分别计算
for i in range(len(iris.feature_names)):
pccs = pearsonr(d[:,i], iris.target)
print(pccs)
# numpy 的计算方法
# pccs = np.corrcoef(d[:,i], iris.target)
# print(pccs)
2.1.3 卡方检验
在于比较理论频数和实际频数的吻合程度或拟合优度问题。其主要应用于分类变量,根据样本数据推断总体分布与期望分布是否有显著差异或推断两个分类变量是否相关或相互独立。
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# 选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2,k=2).fit_transform(iris.data,iris.target)
2.1.4 互信息法
两个随机变量的互信息(mutual information)是变量间相互依赖性的量度。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BoBuzXcF-1662046097722)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d62761dd1e114e829264b3ad2fb3f3f2~tplv-k3u1fbpfcp-watermark.image?)]
from sklearn.datasets import load_iris
from sklearn import metrics
'''
它的参数为两个列表sample,label。由上文互信息的对称性可知,sample与label是对称的,可互换。且这个函数的log以自然底数e为底。
'''
iris = load_iris()
d = iris.data
#print(iris.feature_names)
#print(iris.data)
#对数据的每个特征分别计算
for i in range(len(iris.feature_names)):
res = metrics.mutual_info_score(d[:,i], iris.target)
print(res)
2.2 Wrapper:包装法
3.2.1 递归特征消除法
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
使用feature_selection库的RFE类来选择特征的代码如下:
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
iris = load_iris()
# 递归特征消除法,返回特征选择后的数据
# 参数estimator为基模型
# 参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(),n_features_to_select=2).fit_transform(iris.data,iris.target)
2.3 Embedded:嵌入法
2.3.1 基于惩罚项的特征选择法
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。
使用feature_selection库的SelectFromModel类结合带L2惩罚项的逻辑回归模型,来选择特征的代码如下:
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
iris = load_iris()
#带L2惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l2", C=0.1)).fit_transform(iris.data, iris.target)
2.3.2基于树模型的特征选择法
GBDT 梯度提升分类树模型
树模型中GBDT也可以用来作为基模型进行特征选择,用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_iris
iris = load_iris()
# GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data,iris.target)
RF随机森林模型
使用随机森林树模型对特征的重要度进行排名,并将特征排名进行可视化展示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ATYnLEq-1662046097723)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5d1c50098d49431c883daf33e51e5543~tplv-k3u1fbpfcp-watermark.image?)]
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
# instantiate model
model = RandomForestClassifier(n_estimators=200, random_state=0)
# fit model
model.fit(X,y)
# feature importance
importances = model.feature_importances_
# visualization
cols = iris.feature_names
(pd.DataFrame(importances, cols, columns = ['importance'])
.sort_values(by='importance', ascending=True)
.plot(kind='barh', figsize=(4,10)))
2.4 降维
2.4.1 主成分分析法(PCA)
主要用于削减特征数量,该方法保存数据中对方差影响最大的那些特征,极其容易受到特征尺度的影响,因此运用该方法前需进行特征标准化处理,确保每一特征的同等重要性。PCA算法内部采用SVD(奇异值分解)实现。
PCA的主要目的是降低高维特征空间的维数。原始特征被重新投影到新的维度(即主成分)。 最终目标是找到最能解释数据方差的特征数量。
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
iris = load_iris()
# 主成分分析法,返回降维后的数据
# 参数n_components为主成分数目
PCA(n_components=2).fit_transform(iris.data)
2.4.2 线性判别分析法(LDA)
LDA的全称是Linear Discriminate Analysis(线性判别分析),与PCA不同的是,LDA是有监督学习。基本思想是将带标签的高维样本投影到更低维度的空间中,使投影后的点按类别区分,相同类别的点将会在投影后的空间中更接近,形成一簇一簇的情形
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.datasets import load_iris
iris = load_iris()
# 线性判别分析法,返回降维后的数据
# 参数n_components为降维后的维数
LDA(n_components=2).fit_transform(iris.data,iris.target)
LDA 乳腺癌分类任务案例
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
cancer = load_breast_cancer()
data=cancer["data"]
col = cancer['feature_names']
x = pd.DataFrame(data,columns=col)
target = cancer.target.astype(int)
y = pd.DataFrame(target,columns=['target'])
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=1)
clf = LinearDiscriminantAnalysis(n_components=1)
model=clf.fit(x_train,y_train)
y_pred = model.predict(x_test)
print(classification_report(y_test, y_pred))