学好Scikit-Learn,于是你默默地推了一下酷酷的墨镜【下篇】

简介: 讲完Scikit-Learn的数据表示和评估器API的基础知识、简单线性回归,小天将在本文中为大家带来鸢尾花数据的分类、降维和聚类,还有手写数据的探索

此前小天分享了PyTorc干货的Scikit-Learn上篇(点击蓝字可直接阅读),看完下篇希望你能马上学溜PyTorch!(万一这回就学以致用了呢,我先收藏为敬)

讲完Scikit-Learn的数据表示和评估器API的基础知识、简单线性回归,小天将在本文中为大家带来鸢尾花数据的分类、降维和聚类,还有手写数据的探索,耐心往下看吧~

image.png

Scikit-Learn·下篇

有监督学习示例:鸢尾花数据分类

如何为鸢尾花数据集建立模型,先用一部分数据进行训练,再用模型预测出其他样本的标签?

我们将使用非常简单的高斯朴素贝叶斯(Gaussian naive Bayes)方法完成这个任务,这个方法假设每个特征中属于每一类的观测值都符合高斯分布。因为高斯朴素贝叶斯方法速度很快,而且不需要选择超参数,所以通常很适合作为初步分类手段,再借助更复杂的模型进行优化之前使用。

先将数据分割成训练集(training set)和测试集(testing set),借助train_test_split 函数

from sklearn.cross_validation import train_test_split
Xtrain, Xtest, ytrain, ytest = train_test_split(X_iris, y_iris,
                                                random_state=1)

用下面的模型来预测标签

from sklearn.naive_bayes import GaussianNB      #1.选择模型类
model = GaussianNB()                          #2.初始化模型
model.fit(Xtrain, ytrain)                      #3.用模型拟合数据
y_model = model.predict(Xtest)                 #4.对新数据进行预测

用accuracy_score 工具验证模型预测结果的准确率(预测的所有结果中,正确结果占总预测样本数的比例)

from sklearn.metrics import accuracy_score
accuracy_score(ytest, y_model)

image.png

准确率竟然高达97%,常简单的分类算法也可以有效地学习这个数据集!

无监督学习示例:鸢尾花数据降维

无监督学习问题——对鸢尾花数据集进行降维,以便能更方便地对数据进行可视化。鸢尾花数据集由四个维度构成,即每个样本都有四个维度。

降维的任务是要找到一个可以保留数据本质特征的低维矩阵来表示高维数据。降维通常用于辅助数据可视化的工作,毕竟用二维数据画图比用四维甚至更高维的数据画图更方便!

使用主成分分析(principal component analysis,PCA)方法,这是一种快速线性降维技术。

from sklearn.decomposition import PCA  # 1.选择模型类
model = PCA(n_components=2)            # 2.设置超参数,初始化模型
model.fit(X_iris)                      # 3.拟合数据,注意这里不用y变量
X_2D = model.transform(X_iris)         # 4. 将数据转换为二维

画出结果,将二维数据插入到鸢尾花的DataFrame 中,然后用 Seaborn 的lmplot 方法画图。

iris['PCA1'] = X_2D[:, 0]
iris['PCA2'] = X_2D[:, 1]
sns.lmplot("PCA1", "PCA2", hue='species', data=iris, fit_reg=False);

image.png

二维数据表示图可以看出,虽然PCA 算法根本不知道花的种类标签,但不同种类的花还是被很清晰地区分开来。

无监督学习示例:鸢尾花数据聚类

对鸢尾花数据进行聚类。聚类算法是要对没有任何标签的数据集进行分组。我们将用一个强大的聚类方法——高斯混合模型(Gaussian mixture model,GMM)

from sklearn.mixture import GaussianMixture       #1.选择模型类

model = GaussianMixture(n_components=3,
                      covariance_type='full')
#SK-Learn 0.18
#model = GMM(n_components=3,
#            covariance_type='full')   #2.设置超参数,初始化模型
model.fit(X_iris)                    #3.拟合数据,注意不需要y变量
y_gmm = model.predict(X_iris)         #4. 确定簇标签

用Seaborn画出结果

iris['cluster'] = y_gmm
sns.lmplot("PCA1", "PCA2", data=iris, hue='species',
           col='cluster', fit_reg=False);

image.png

GMM 算法的训练效果:setosa(山鸢尾花)类的花在簇0 中被完美地区分出来,唯一的遗憾是第三幅图中versicolor(变色鸢尾 花)和virginicaI(维吉尼亚鸢尾花)还有一点混淆。

1.3 应用:手写数字探索

手写数字识别:简单点说,这个问题包括图像中字符的定位和识别两部分。为了演示方便,我们选择使用Scikit-Learn 中自带的手写数字数据集。

加载并可视化手写数字

from sklearn.datasets import load_digits
digits = load_digits()
digits.images.shape

image.png

图像数据是一个三维矩阵:共有1797个样本,每张图像都是8像素×8像素

import matplotlib.pyplot as plt

fig, axes = plt.subplots(10, 10, figsize=(8, 8),
                         subplot_kw={'xticks':[], 'yticks':[]},
                         gridspec_kw=dict(hspace=0.1, wspace=0.1))

for i, ax in enumerate(axes.flat):
    ax.imshow(digits.images[i], cmap='binary', interpolation='nearest')
    ax.text(0.05, 0.05, str(digits.target[i]),
            transform=ax.transAxes, color='green')

image.png

在Scikit-Learn 中使用数据,需要一个维度为[n_samples, n_features] 的二维特征矩阵——可以将每个样本图像的所有像素都作为特征,也就是将每个数字的8 像素×8 像素平铺成长度为64 的一维数组。另外,还需要一个目标数组,用来表示每个数字的真实值(标签)。这两份数据已经放在手写数字数据集的data 与target 属性中,直接使用即可:

X = digits.data
X.shape

image.png

y = digits.target
y.shape

无监督学习:降维

想对具有64 维参数空间的样本进行可视化,但是在如此高维度的空间中进行可视化十分困难;借助无监督学习方法将维度降到二维。这次试试流形学习算法中的Isomap算法对数据进行降维。

from sklearn.manifold import Isomap
iso = Isomap(n_components=2)
iso.fit(digits.data)
data_projected = iso.transform(digits.data)
data_projected.shape

image.png

数据已经投影到二维,把数据画出来;

plt.scatter(data_projected[:, 0], data_projected[:, 1], c=digits.target, s=20,
            edgecolor='none', alpha=0.5,
            cmap=plt.cm.get_cmap('Spectral', 10))
plt.colorbar(label='digit label', ticks=range(10))
plt.clim(-0.5, 9.5);

image.png

这幅图呈现出了非常直观的效果,让我们知道数字在64 维空间中的分离(可识别)程度。

例如,在参数空间中,数字0和数字1基本不会重叠。根据常识也是如此:数字0 是中间一片空白,而数字1 是中间一片黑。另外,从图中会发现,数字1 和数字4 好像有点儿混淆——也许是有些人写数字1 的时候喜欢在上面加个“帽子”,因此看起来就像是数字4。

数字分类

我们需要找到一个分类算法,对手写数字进行分类。

将数据分成训练集和测试集,然后用高斯朴素贝叶斯模型来拟合:

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, random_state=0)
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(Xtrain, ytrain)
y_model = model.predict(Xtest)

获得模型的准确率

from sklearn.metrics import accuracy_score
accuracy_score(ytest, y_model)

image.png

一个非常简单的模型,数字识别率就可以达到80%以上!但仅依靠这个指标,我们无法知道模型哪里做得不够好,解决这个问题的办法就是用混淆矩阵(confusionmatrix)。可以用Scikit-Learn 计算混淆矩阵,然后用Seaborn画出来。

from sklearn.metrics import confusion_matrix

mat = confusion_matrix(ytest, y_model)

sns.heatmap(mat, square=True, annot=True, cbar=False)
plt.xlabel('predicted value')
plt.ylabel('true value');

image.png

从图中可以看出,误判的主要原因在于许多数字2 被误判成了数字1或数字8。另一种显示模型特征的直观方式是将样本画出来,然后把预测标签放在左下角,用绿色表示预测正确,用红色表示预测错误

fig, axes = plt.subplots(10, 10, figsize=(8, 8),
                         subplot_kw={'xticks':[], 'yticks':[]},
                         gridspec_kw=dict(hspace=0.1, wspace=0.1))

test_images = Xtest.reshape(-1, 8, 8)

for i, ax in enumerate(axes.flat):
    ax.imshow(test_images[i], cmap='binary', interpolation='nearest')
    ax.text(0.05, 0.05, str(y_model[i]),
            transform=ax.transAxes,
            color='green' if (ytest[i] == y_model[i]) else 'red')

image.png

通过观察这部分样本数据,我们能知道模型哪里的学习不够好。如果希望分类准确率达到80% 以上,可能需要借助更加复杂的算法,例如支持向量机、随机森林,或者其他分类算法。

1.4 小结

本节介绍了Scikit-Learn 中数据表示方法和评估器API 的基本特征。除了评估器的类型不同,导入模型/ 初始化模型/ 拟合数据/ 预测数据的步骤是完全相同的。对评估器API 有了基本认识之后,你可以参考Scikit-Learn 文档继续学习更多知识,并在你的数据上尝试不同的模型哦~

目录
相关文章
|
25天前
|
机器学习/深度学习 数据采集 算法
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
37 3
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
32 1
|
2月前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第12天】本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和入门实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型训练和评估等步骤,并提供了代码示例。通过本文,读者可以掌握机器学习的基本流程,并为深入学习打下坚实基础。
24 1
|
2月前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型选择与训练、模型评估及交叉验证等关键步骤。通过本文,初学者可以快速上手并掌握机器学习的基本技能。
57 2
|
2月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
78 1
|
2月前
|
机器学习/深度学习 人工智能 数据挖掘
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第6天】在人工智能领域,机器学习已成为核心技术。本文指导初学者使用Python与Scikit-learn入门机器学习,涵盖基本概念、环境搭建、数据处理、模型训练及评估等环节。Python因简洁性及其生态系统成为首选语言,而Scikit-learn则提供了丰富工具,简化数据挖掘与分析流程。通过实践示例,帮助读者快速掌握基础知识,为进一步深入研究奠定坚实基础。
29 4
|
2月前
|
机器学习/深度学习 数据采集 算法
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
43 2
|
3月前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
141 8
|
3月前
|
机器学习/深度学习 算法 数据挖掘
|
4月前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。