sklearn学习(3)数据降维

(1)特征选择

特征选择是只选择一部分特征,常见的方法有:移除低方差法,单变量统计法、基于模型的选择、递归特征消除等方法。

移除低方差特征 VarianceThreshold

复制代码
#移除低方差特征,方差小代表这组数据相差不大,可以去掉
from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris

iris=load_iris()
X=iris.data
X_name=iris.feature_names
y=iris.target
#移除方差小于0.55的特征
sel=VarianceThreshold(threshold=0.55)
x_new=sel.fit_transform(X)
print("原数据:")
print(X.shape)
print("去除后")
print(x_new.shape)

VarianceThreshold只需传入一个阈值,经过fit_transform后会过滤掉方差小于该阈值的数据。

单变量数据选择:是基于统计检验选择最佳特征,从原始数据中选择K个最好的

复制代码
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression

x=load_iris().data
y=load_iris().target
#选择k个最好的特征,返回选择特征后的数据
sel=SelectKBest(f_regression,k=2)
#f_regression是其中一种评估方式,计算每个特征和目标之间的f值和p值
#还有 chi2:卡方、mutual_info_classif:互信息(分类)、
#mutual_info_regression互信息(回归)
x_new=sel.fit_transform(x,y)#这里x y都要传入,和其他不同
print("评分:",sel.scores_)
print(x)
print(x_new)

SelectKBest函数需要传入两个参数,第一个是评价方式有多种:f_regression是其中一种评估方式,计算每个特征和目标之间的f值和p值还有 chi2:卡方、mutual_info_classif:互信息(分类)、

mutual_info_regression互信息(回归)。第二个是保留特征数,传入几就保留几个评分最高的特征。

基于模型的特征选择

基于模型的特征选择,是根据不同模型进行选择特征,这里以线性模型为例

复制代码
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso
x=load_iris().data
y=load_iris().target
#使用L1正则化的线性模型
lasso = Lasso(alpha=0.01)
lasso.fit(x,y)
#特征选择
sel=SelectFromModel(lasso,threshold=0.1)
x_new=sel.fit_transform(x,y)
print(x)
print(x_new)

lasso是正则化后的特征值,threshold是阈值,只会保留重要性大于0.1的数据,其他重要性小于0.1的会被忽略。

(2)特征提取,这里介绍一下主成分分析(PCA)和线性判别分析(LDA)。

PCA的原理是通过线性变换把原始特征转化为一组线性不相关的变量,是为了找让点分的最开的方向,并按照方差大小排序,是一种无监督方式,最求的是最大化方差和。

复制代码
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from matplotlib import pyplot as plt
from sympy.solvers.diophantine.diophantine import Linear

iris=load_iris()
x=iris.data
y=iris.target
#先给数据做个标准化,数据会更好
Stand_S=StandardScaler()
x_stand=Stand_S.fit_transform(x)
pca=PCA(n_components=2)
#n_components=2表示降维后的维度
# #还有一个svd_solver参数 指定求解器 一般默认,对于大型数据,使用'randomized'更高效
x_pca=pca.fit_transform(x_stand)
print(x_pca)

PCA函数中只需要传入一个参数,n_components=n即可,是表示原始数据降维后要保留的维数,上面代码是降维到2维。

LDA的原理是追求最大化类间距离,最小化类内距离,其是一种有监督方法,需要用到y值

复制代码
#线性判别分析(LDA):最小化类内距离,最大化类间距离
#LDA是一种有监督的降维技术,需要用到标签信息
lda=LinearDiscriminantAnalysis(n_components=2)
#n_components=2表示降维后的维度
x_lda=lda.fit_transform(x_stand,y)
plt.scatter(x_lda[y==0,0],x_lda[y==0,1],color='r',marker='o',label='0')
plt.scatter(x_lda[y==1,0],x_lda[y==1,1],color='b',marker='x',label='1')
plt.show()
print(x_lda)

注意如果先把数据标准化之后再传入会好很多。再PCA和LDA之前都把数据标准化了,避免由于数据量纲不一样影响而影响数据特征的提取。

相关推荐
冬奇Lab15 小时前
RAG 系列(五):Embedding 模型——语义理解的核心
人工智能·llm·aigc
深小乐15 小时前
AI 周刊【2026.04.27-05.03】:Anthropic 9000亿美元估值、英伟达死磕智能体、中央重磅定调AI
人工智能
码点滴15 小时前
什么时候用 DeepSeek V4,而不是 GPT-5/Claude/Gemini?
人工智能·gpt·架构·大模型·deepseek
狐狐生风15 小时前
LangChain 向量存储:Chroma、FAISS
人工智能·python·学习·langchain·faiss·agentai
波动几何15 小时前
CDA架构代码工坊技能cda-code-lab
人工智能
舟遥遥娓飘飘15 小时前
DeepSeek V4技术变革对社会结构与职业体系的重构
人工智能
狐狐生风15 小时前
LangChain RAG 基础
人工智能·python·学习·langchain·rag·agentai
哥布林学者15 小时前
深度学习进阶(十五)通道注意力 SE
机器学习·ai
墨北小七16 小时前
使用InspireFace进行智慧楼宇门禁人脸识别的训练微调
人工智能·深度学习·神经网络
HackTorjan16 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn