自学内容网 自学内容网

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

导包小总结(不全面):

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_iris

model = 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_)

 


原文地址:https://blog.csdn.net/SaNDJie/article/details/143749741

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!