2024-11-13 学习人工智能的Day26 sklearn(2)

特征选择

VarianceThreshold(低方差过滤特征选择):

类似于之前openCV中的threshold函数,只是此在创建实例工具时在参数中设置用于筛选的阈值。因为目前来说基本所有的工具的操作方式大致相同,都是引用后进行调用。

emm,根据AI的回答:在使用fit后,方法本身并不返回固定值,只是更新模型的属性,而在此方法中,这些属性包括了特征方差等信息。

我不理解的点:因为我在创建实例对象时就已经设定了阈值参数,然后在我fit后我留下应该是需要的特征,而当我使用transform时,应该是直接根据我fit获取需要特征直接提取这些特征。

我的理解有误,fit方法并不返回任何值,它只计算训练数据集中每个特征的方差并记录,还确定了那些特征的方差高于阈值,这些信息被储存在variances_属性中,它还储存了一个实际使用的阈值,当用户没有指定时,这个值由fit来计算,最后储存在threshold _属性中,注意是fit事实上并不会修改任何值

fit更新后,transform使用更新后的方差和阈值进行特征过滤,而tranform则是实际执行特征选择的地方

python 复制代码
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
data=pd.DataFrame([[10,1],[11,3],[11,1],[11,5],[11,9],[11,3],[11,2],[11,6]])
transfer = VarianceThreshold(threshold=1.5)# 设置阈值方差
res = transfer.fit_transform(data)
print(res)

根据相关系数的特征选择

这里的系数就是使用皮尔逊系数来进行判断了。从scipy.stats中引入pearsonr方法,此方法返回的是两个值,一个statistic,此数的范围为[-1,1],其值越接近两边的1相关性越强,而另一个职为pvalue这个值只做了解,它是数值越小越相关。

主成分分析(PCA)

没有办法很清楚的解释,大致的解释只能是:PCA的核心目标是从原始特征空间中找到一个新的坐标系统,使得数据在新坐标轴上的投影能够最大程度地保留数据的方差,同时减少数据的维度。

然后就只能介绍一下PCA的用法,

python 复制代码
from sklearn.decomposition import PCA
# 然后是方法的调用
data = [[2,8,4,5], 
        [6,3,0,8], 
        [5,4,9,1]]
transfer = PCA(n_components=2)
# 注意的是PCA的实例创建时的参数,n_components,当它为大于一的整数时,表示减少至多少特征
# 当它为小于1大于0的小数时,表示保留多少比例的信息
res = transfer.fit_transform(data)
print(res)

KNN算法

K-近邻算法,根据K个邻居样本的类别来判断当前样本的类别;

如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别

比如: 有10000个样本,选出7个到样本A的距离最近的,然后这7个样本中假设:类别1有2个,类别2有3个,类别3有2个.那么就认为A样本属于类别2,因为它的7个邻居中 类别2最多(近朱者赤近墨者黑)

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
standard = StandardScaler()
x_train = standard.fit_transform(x_train)
x_test = standard.transform(x_test)

transfer = KNeighborsClassifier(n_neighbors=7)
transfer.fit(x_train,y_train)
y_predict = transfer.predict(x_test)
score = transfer.score(x_test,y_test)
score

交叉验证

1 .保留交叉验证

在这种交叉验证技术中,整个数据集被随机地划分为训练集和验证集。根据经验法则,整个数据集的近70%被用作训练集,其余30%被用作验证集。也就是我们最常使用的,直接划分数据集的方法。

优点:很简单很容易执行

缺点:不适合不平衡的数据集,一大块数据被剥夺了训练模型的机会

2.k-折交叉验证

K-Fold交叉验证技术中,整个数据集被划分为K个大小相同的部分。每个分区被称为 一个"Fold"。所以我们有K个部分,我们称之为K-Fold。一个Fold被用作验证集,其余的K-1个Fold被用作训练集。

3.分层k-折交叉验证Stratified k-fold

K-折交叉验证的变种, 分层的意思是说在每一折中都保持着原始数据中各个类别的比例关系,比如说:原始数据有3类,比例为1:2:1,采用3折分层交叉验证,那么划分的3折中,每一折中的数据类别保持着1:2:1的比例,这样的验证结果更加可信。

例子的话是关于k-折交叉验证的

# 分层k-折交叉验证
from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

#  加载数据
iris = load_iris()
x = iris.data
y = iris.target

# 初始化分层k-折交叉验证器
strat_k_fold = StratifiedKFold(n_splits=5,shuffle=True,random_state=42)

# 创建一个k近邻分类器实例
knn = KNeighborsClassifier(n_neighbors=7)

# # 进行交叉认证
accuracies = []
for train_index ,test_index in strat_k_fold.split(x,y):
        x_train,x_test = x[train_index],x[test_index]
        y_train,y_test = y[train_index],y[test_index]

        # 数据预处理(标准化)
        scaler = StandardScaler()
        x_train_scaler = scaler.fit_transform(x_train)
        x_test_scaler = scaler.transform(x_test)

        # 使用k近邻分类器进行训练
        knn.fit(x_train_scaler,y_train)

        # # 输出每次折叠的准确得分
        score = knn.score(x_test,y_test)
        # print(score)
        accuracies.append(score)
print(sum(accuracies)/len(accuracies)) # 平均得分

超参数搜索

今天老师讲的最后的一个问题

超参数搜索也叫网格搜索(Grid Search)

比如在KNN算法中,k是一个可以人为设置的参数,所以就是一个超参数。网格搜索能自动的帮助我们找到最好的超参数值。

from sklearn.model_selection import GridSearchCV
此API同时进行交叉验证和网格搜索,而GridSearchCV实际也是一个估计器,它有以下几个重要的参数:
      best_params_  最佳参数
      best_score_ 在训练集中的准确率
      best_estimator_ 最佳估计器
      cv_results_ 交叉验证过程描述
      best_index_最佳k在列表中的下标

依旧是鸢尾花的分类示例

#%%
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

iris = load_iris()

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)

standard = StandardScaler()
x_train = standard.fit_transform(x_train)
x_test = standard.transform(x_test)

knn = KNeighborsClassifier()
estimator = GridSearchCV(estimator=knn,param_grid={"n_neighbors":[1,3,5,7,9,11]},cv=5)

estimator.fit(x_train,y_train)

# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("在测试集中的准确率为:\n", score)  #0.9736842105263158

# 最佳参数:best_params_
print("最佳参数:\n", estimator.best_params_) #{'n_neighbors': 3}, 说明k=3时最好
# 最佳结果:best_score_
print("在训练集中的准确率:\n", estimator.best_score_)  #0.9553030303030303
# 最佳估计器:best_estimator_
print("最佳估计器:\n", estimator.best_estimator_) # KNeighborsClassifier(n_neighbors=3)
# 交叉验证结果:cv_results_
print("交叉验证过程描述:\n", estimator.cv_results_)
#最佳参数组合的索引:最佳k在列表中的下标
print("最佳参数组合的索引:\n",estimator.best_index_)
相关推荐
hgy89691 分钟前
Ekman理论回归
学习
Watermelo6178 分钟前
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
人工智能·深度学习·神经网络·mongodb·机器学习·自然语言处理·数据挖掘
坚硬果壳_19 分钟前
《硬件架构的艺术》笔记(一):亚稳态
笔记·学习
AI算法-图哥20 分钟前
pytorch量化训练
人工智能·pytorch·深度学习·文生图·模型压缩·量化
大山同学23 分钟前
DPGO:异步和并行分布式位姿图优化 2020 RA-L best paper
人工智能·分布式·语言模型·去中心化·slam·感知定位
机器学习之心24 分钟前
时序预测 | 改进图卷积+informer时间序列预测,pytorch架构
人工智能·pytorch·python·时间序列预测·informer·改进图卷积
糊涂君-Q1 小时前
Python小白学习教程从入门到入坑------第三十一课 迭代器(语法进阶)
python·学习·程序人生·考研·职场和发展·学习方法·改行学it
qiyi.sky1 小时前
JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
java·前端·笔记·学习·tomcat
天飓1 小时前
基于OpenCV的自制Python访客识别程序
人工智能·python·opencv
檀越剑指大厂1 小时前
开源AI大模型工作流神器Flowise本地部署与远程访问
人工智能·开源