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
这样的数据转换器时,fit
、fit_transform
和transform
这三个方法的使用是至关重要的,它们各自有不同的作用:
-
fit:
-
这个方法用来计算数据的统计信息,比如均值和标准差(在
StandardScaler
的情况下)。这些统计信息随后会被用于数据的标准化。 -
你应当仅在训练集上使用
fit
方法。
-
-
fit_transform:
-
这个方法相当于先调用
fit
再调用transform
,但是它在内部执行得更高效。 -
它同样应当仅在训练集上使用,它会计算训练集的统计信息并立即应用到该训练集上。
-
-
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)!