作者: | 来源:互联网 | 2023-09-10 15:36
文章目录
- 序言
- 正题
- 编程环境
- 数据准备
- 导包
- 导入数据
- PCA参数的选择
- 画降维后特征的信息量累计和曲线
- 结合模型,进一步选择n_components的值
- 结合模型,寻得最佳参数
- KNN模型表现
- PCA用于训练集测试集
- 两种思路的对比
- 总结
序言
在前面的博文中我们了解了降维算法PCA,以及PCA的参数。这篇文章建立在对PCA有了一定的基础的前提上。本篇文章主要将PCA算法在实际中的应用。包含PCA参数的选择,训练集,测试集上PCA的使用,解决PCA实际应用中的困惑。本文使用的是kaggle上digit-regognizer数据集。
正题
编程环境
- python3.7
- anaconda
- jupyter notebook
数据准备
可以通过官方渠道获得数据,也可以通过博主上传的数据下载。
这次使用的数据集是kaggle的digit-recognizer数据集。数据集中包含三个csv文件如下图
sample_submission.csv是提交到kaggle的csv文件格式。train.csv是数据的训练集,包含了784个特征和一个标签列。共42000组数据。test.csv为测试集,包含了784个特征,该数据集没有标签这一列,共28000组数据。本次仅使用该数据集中的训练集。通过sklearn将原训练集划分为新的训练集,测试集。
导包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split %matplotlib inline
导入数据
file = "../data/digit-recognizer/train.csv" df = pd.read_csv(file)df.shape
X = df.loc[:, df.columns != 'label']
y = df.loc[:, df.columns == 'label'].values.ravel()
PCA参数的选择
画降维后特征的信息量累计和曲线
这一步PCA不人为设置任何参数,使用PCA的默认值。通过explained_variance_ratio_属性获得新的特征的信息量占原信息的信息量的比例
pca_default = PCA()
X_defaule = pca_default.fit_transform(X)
explained_vars = pca_default.explained_variance_ratio_
var_sum = np.cumsum(explained_vars)
plt.figure(figsize=(10, 5))
plt.plot(range(X.shape[1]), var_sum)
plt.xticks(range(0, X.shape[1], 50))
plt.show()
结合模型,进一步选择n_components的值
前面已经提到过了,对n_components参数的选择,一般是选择曲线的转折点处。
n_components = range(1, 101, 10)
scores = []
for i in n_components :X_new = PCA(n_components=i).fit_transform(X)scores.append(cross_val_score(RandomForestClassifier(n_estimators=21, random_state=1),X_new, y, cv=5).mean())fig = plt.figure(figsize=(10, 5))
plt.plot(n_components, scores)
plt.xticks(range(0, 101, 10))
plt.show()
结合模型,寻得最佳参数
n_components = range(10, 30)
scores = []
for i in n_components :X_new = PCA(n_components=i).fit_transform(X)scores.append(cross_val_score(RandomForestClassifier(n_estimators=21, random_state=1),X_new, y, cv=5).mean())fig = plt.figure(figsize=(10, 5))
plt.plot(n_components, scores)
plt.xticks(range(9, 31))
plt.show()
从图中可以看出当n_components=24时模型的表选达到最好
确定了PCA的最佳参数,接下来要将模型的表现推到最好就需要对模型进行调参了。关于随机森林的调参看我前面的博文。关于调参这里不进行展示了。如果经过调参,模型的表现还是没有多大提高,就可以考虑换一个模型试试了。但是换模型可能遇到的问题有:可能需要重新进行PCA降维操作。
KNN模型表现
X_final = PCA(n_components=24).fit_transform(X)
knn = KNeighborsClassifier()
score = cross_val_score(knn, X_final, y, cv=10).mean()
print(score)
PCA用于训练集测试集
上面已经将来PCA的参数选择了。但是还是有一个疑惑留给我们。那就是怎样让我的降维PCA能够适用于训练集,测试集呢。这里沿用上面的数据进行讲解。
可能的两种思路
- 思路1:直接实例化PCA并分别再训练姐,测试集上fit_transform获得新的特征
- 思路2:实例化PCA,再训练集上进行PCA训练,并将训练后的PCA应用到训练集,测试集。
显而易见思路二是正确的。这个思路可参考模型训练应用的过程。
两种思路的对比
训练集测试集的划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=3)
思路一结果
pca_24 = PCA(n_components=24)
pca_X_train = pca_24.fit_transform(X_train)
pca_X_test = pca_24.fit_transform(X_test)
knn = KNeighborsClassifier()
knn.fit(pca_X_train, y_train)
score = knn.score(pca_X_test, y_test)
print(score)
思路二结果
pca_24 = PCA(n_components=24).fit(X_train)
pca_X_train = pca_24.transform(X_train)
pca_X_test = pca_24.transform(X_test)
knn = KNeighborsClassifier()
knn.fit(pca_X_train, y_train)
score = knn.score(pca_X_test, y_test)
print(score)
对比两个结果可以看出,通过训练后再应用pca,明显才是正确的做法。模型的表现简直是质的飞跃。
总结
到这里关于PCA的基础已经学习完了。需要注意的就是PCA参数的选择方法。PCA再训练集,测试集上的使用,一定要经过“训练”。PCA再训练集,测试集上的使用,一定要经过“训练”。PCA再训练集,测试集上的使用,一定要经过“训练”。。重要的事情说三遍。
欢迎在评论区和我进行讨论,互相学习