24.11.13 机器学习 特征降维(主成份分析) KNN算法 交叉验证(K-Fold) 超参数搜索

embedded/2024/11/20 8:49:46/

导包小总结(不全面):

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.feature_extraction import DictVectorizer(字典数据集的划分)

from sklearn.feature_extraction.text import CountVectorizer(特征提取)

特征降维

主成份分析(PCA)

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

使用$(x0, y0)$表示一个点, 表明该点有两个特征, 而映射到L上有一个特征就可以表示这个点了。这就达到了降维的功能 。

投影到L上的值就是降维后保留的信息,投影到与L垂直的轴上的值就是丢失的信息。保留信息/原始信息=信息保留的比例

下图中红线上点与点的距离是最大的,所以在红色线上点的方差最大,粉红线上的刚好相反.

所以红色线上点来表示之前点的信息损失是最小的。

步骤

得到矩阵

用矩阵P对原始数据进行线性变换,得到新的数据矩阵Z,每一列就是一个主成分, 如下图就是把10维降成了2维,得到了两个主成分

根据主成分的方差等,确定最终保留的主成分个数, 方差大的要留下。一个特征的多个样本的值如果都相同,则方差为0, 则说明该特征值不能区别样本,所以该特征没有用。

比如下图的二维数据要降为一维数据,图形法是把所在数据在二维坐标中以点的形式标出,然后给出一条直线,让所有点垂直映射到直线上,该直线有很多,只有点到线的距离之和最小的线才能让之前信息损失最小。

这样之前所有的二维表示的点就全部变成一条直线上的点,从二维降成了一维。

api

from sklearn.decomposition import PCA

PCA(n_components=None)

主成分分析

n_components:

        实参为小数时:表示降维后保留百分之多少的信息

        实参为整数时:表示减少到多少特征

代码演示:

注意点

在数据预处理中,特别是使用如StandardScaler这样的数据转换器时,fitfit_transformtransform这三个方法的使用是至关重要的,它们各自有不同的作用:

  1. fit:

    • 这个方法用来计算数据的统计信息,比如均值和标准差(在StandardScaler的情况下)。这些统计信息随后会被用于数据的标准化。

    • 你应当仅在训练集上使用fit方法。

  2. fit_transform:

    • 这个方法相当于先调用fit再调用transform,但是它在内部执行得更高效。

    • 它同样应当仅在训练集上使用,它会计算训练集的统计信息并立即应用到该训练集上。

  3. transform:

    • 这个方法使用已经通过fit方法计算出的统计信息来转换数据。

    • 它可以应用于任何数据集,包括训练集、验证集或测试集,但是应用时使用的统计信息必须来自于训练集。

当你在预处理数据时,首先需要在训练集X_train上使用fit_transform,这样做可以一次性完成统计信息的计算和数据的标准化。这是因为我们需要确保模型是基于训练数据的统计信息进行学习的,而不是整个数据集的统计信息。

一旦scaler对象在X_train上被fit,它就已经知道了如何将数据标准化。这时,对于测试集X_test,我们只需要使用transform方法,因为我们不希望在测试集上重新计算任何统计信息,也不希望测试集的信息影响到训练过程。如果我们对X_test也使用fit_transform,测试集的信息就可能会影响到训练过程。

总结来说:我们常常是先fit_transform(x_train)然后再transform(x_text)

# PCA 主成份分析
from sklearn.decomposition import PCA
my_data = [[1,5,6,1],[1,9,8,9],[1,1,4,6],[1,4,2,3]]
# 创建
# n_components 参数,如果填入 0.95 这种小数,则是保留95%的信息
#                   如果填入的是 2 这种数字,则多个特征降维到两个特征
per = PCA(n_components=0.01)
result = per.fit_transform(my_data)
print(result)

KNN算法-分类

KNN缺点

对于大规模数据集,计算量大,因为需要计算测试样本与所有训练样本的距离。

对于高维数据,距离度量可能变得不那么有意义,这就是所谓的“维度灾难”

需要选择合适的k值和距离度量,这可能需要一些实验和调整

 模型选择与调优

交叉验证 

保留交叉验证(train_test_split)

K-折交叉验证(KFold)

分成K-折交叉验证(StratifiedKFold)

from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold
from sklearn.neighbors import KNeighborsClassifier
x, y = load_iris(return_X_y=True)  # 直接返回x,y的元组
folder = StratifiedKFold(n_splits=5, shuffle=True, random_state=666)
iter = folder.split(x, y)
knn = KNeighborsClassifier(n_neighbors=7)
score_arr=[]
for train_index, test_index in iter:print(train_index, test_index)model = knn.fit(x[train_index], y[train_index])s = model.score(x[test_index], y[test_index])score_arr.append(s)
print("平均准确率:", sum(score_arr)/len(score_arr))

超参数搜索

超参数搜索也叫网格搜索

# 超参数的选择(网格搜索)
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_irismodel = KNeighborsClassifier()
model = GridSearchCV(estimator=model,param_grid={"n_neighbors":[5,7,9]})
X_train,y_train=load_iris(return_X_y=True)
model.fit(X_train,y_train)
print(model.best_params_)
print(model.best_score_)
print(model.best_estimator_)
print(model.cv_results_)
print(model.best_index_)

 


http://www.ppmy.cn/embedded/139029.html

相关文章

企业软文推广如何巧妙借力优质媒体,让品牌在市场中脱颖而出?媒介盒子分享

相比起线下的推广营销,在互联网时代,网络推广营销更符合现在企业品牌的宣传思路。因为相比起传统的营销方式,通过网络实现的线上推广能更精准的实现人群定位,更高效的提高营销资源的使用率,而软文推广,作为…

独立资源池与共享资源池在云计算中各自的优势

在云计算领域,独立资源池和共享资源池是两种关键的资源管理策略,它们各自具有独特的优势,以适应不同的业务需求和场景。 独立资源池的优势 资源独占性:独立资源池为特定应用或用户提供专属的资源,这意味着资源不会被其…

基于SpringBoot的旅游网站(程序+数据库+报告)

基于SpringBoot的旅游网站,系统包含两种角色:管理员、用户,系统分为前台和后台两大模块,主要功能如下。 【前台】: - 首页:展示旅游网站的核心内容,包括推荐的旅游线路、最新的旅游资讯等。 - 旅游线路&am…

Python爬虫下载新闻,Flask展现新闻(2)

上篇讲了用Python从新闻网站上下载新闻,本篇讲用Flask展现新闻。关于Flask安装网上好多教程,不赘述。下面主要讲 HTML-Flask-数据 的关系。 简洁版 如图,页面简单,主要显示新闻标题。 分页,使用最简单的分页技术&…

汽车资讯新篇章:Spring Boot技术启航

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

【Qt 蓝牙服务器实现】

在 Qt 中实现一个蓝牙服务器可以使用 Qt Bluetooth 模块。下面是一个基本的蓝牙服务器示例,它能够接受来自客户端的连接。 首先,请确保你已经安装了 Qt Bluetooth 模块并在项目文件中包含了相关库。 1. 项目文件 (.pro) 配置 在项目文件中添加以下行,以确保包含 Qt Bluet…

selenium元素定位---元素点击交互异常解决方法

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、异常原因 在编写ui自动化时,执行报错元素无法点击:ElementClickInterceptedException 具体报错:selenium.common.exc…

设计模式——模板方法模式

定义一个操作中的算法框架,而将一些步骤延迟到子类中,模版方法模式使得子类可以不改变算法结构即可重新定义算法的某些特定步骤 1.优点: 在父类中定义一个算法,而右它的子类来实现细节处理,在子类实现详细的处理算法并…