热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PCA降维算法应用实例kaggle手写数字识别

文章目录序言正题编程环境数据准备导包导入数据PCA参数的选择画降维后特征的信息量累计和曲线结合模型,进一步选择n_components的值结合模型,寻得


文章目录

    • 序言
    • 正题
      • 编程环境
      • 数据准备
      • 导包
      • 导入数据
      • 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 # PCA降维算法
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score # 交叉检验
from sklearn.neighbors import KNeighborsClassifier # KNN分类器
from sklearn.model_selection import train_test_split # 分割训练集,测试集%matplotlib inline

导入数据

file = "../data/digit-recognizer/train.csv" # 换成自己本地的数据集路径df = pd.read_csv(file)df.shape #(42000, 785)
# 可以看出数据集非常的庞大# 特征标签分离
X = df.loc[:, df.columns != 'label']
y = df.loc[:, df.columns == 'label'].values.ravel()

PCA参数的选择


画降维后特征的信息量累计和曲线

这一步PCA不人为设置任何参数,使用PCA的默认值。通过explained_variance_ratio_属性获得新的特征的信息量占原信息的信息量的比例

# 默认返回值PCA返回的特征个数为min(shape(X))
# 获得经过一次变化后的特征的信息量
pca_default = PCA()
X_defaule = pca_default.fit_transform(X)# 获得每一个新特征的信息量占比
explained_vars = pca_default.explained_variance_ratio_# 通过np.cumsum计算特征信息量的累计和
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的选择一般选择曲线上的转折点附近的值
# 从图中可以看出转折点在50-100之间
# 在50 的时候信息量已经达到了80%,在100信息量已经达到了接近90%了
# 再继续网上,信息量增加比较缓慢。继续纠结于更多的特征
# 就与我们降维的目的相悖了。索引选择特征较小的0-100
# 可以知道0-100之间一定有一个值是我们需要的
# 接下来将n_components设置在0-100之间,通过模型的评分
# 选择出一共较优的参数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()

在这里插入图片描述


结合模型,寻得最佳参数

# 从图中可以看出只要10个特征我们的模型就可以有一个很好的表现
# 当特征数量在20的时候模型的表现达到最好,这是步长为10的学习曲线
# 下面进行细致的学习曲线
# 将特征数量控制在10-30之间,画出学习曲线确定最终的PCA参数
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模型表现

# 经过PCA降维后的特征只有24个特征了,与之之前的784给特征相比
# 无疑是少了非常多的,这里可以选择使用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) # 0.971355806769633

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)

思路一结果

# 不fit直接再训练集,测试集上使用pca
# *******************************
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) # 0.7936507936507936
# 难以形象居然有79%的准确度。这属于是运去非常好的了
# 之前的几次表现只有0.3左右。说明这次训练集测试集的划分非常完美

思路二结果

# fit后使用pca
# 不fit直接再训练集,测试集上使用pca
# ******************************************
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) # 0.9691269841269842

对比两个结果可以看出,通过训练后再应用pca,明显才是正确的做法。模型的表现简直是质的飞跃。


总结

到这里关于PCA的基础已经学习完了。需要注意的就是PCA参数的选择方法。PCA再训练集,测试集上的使用,一定要经过“训练”。PCA再训练集,测试集上的使用,一定要经过“训练”。PCA再训练集,测试集上的使用,一定要经过“训练”。。重要的事情说三遍。



欢迎在评论区和我进行讨论,互相学习


推荐阅读
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • 一、死锁现象与递归锁进程也是有死锁的所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作 ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • pythonMatplotlib(二)
    Matplotlib+pandas作图一、对csv文件进行提取ruixi.csv对上述表格进行提取并做图画出图像二、对.xlsx进行提取:rui ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有