监督学习

当我们想要根据给定输入预测某个结果,并且还有输入、输出对的示例时,都应该使用监督学习。

我们的目标是对从未见过的新数据作出准确预测。

监督机器学习问题主要有两种,分别叫作分类(classification)与回归(regression)。

分类问题的目标是预测类别标签(class label),这些标签来自预定义的可选列表。

回归任务的目标是预测一个连续值,编程术语叫作浮点数(floating-pointnumber),数学术语叫作实数(real number)

两个任务的区别就是输出数据是否存在连续性。

泛化:在监督学习中,我们想要在训练数据上构建模型,然后能够对没见过的新数据(这些新数据与训练集具有相同的特性)做出准确预测。如果一个模型能够对没见过的数据做出准确预测,我们就说它能够从训练集泛化(generalize)到测试集。

过拟合:构建一个对现有信息量来说过于复杂的模型。在训练集上表现很好,但不能够泛化到测试集。

欠拟合:与过拟合相反,那么你可能无法抓住数据的全部内容以及数据中的变化,你的模型在训练集上的表现就很差,测试集更差。

我们的模型越复杂,在训练数据上的预测结果就越好。但是,如果我们的模型过于复杂,我们开始过多关注训练集中每个单独的数据点,模型就不能很好地泛化到新数据上。

模型复杂度与训练精度和测试精度之间的权衡

我们学习中往往使用的是固定数据数目的数据集,但是现实生活中,收集更多的数据我们往往能够得到更多的信息,来帮助我们预测,更多的数据可能比模型调整参数更重要。

1、模拟二分类数据集forge数据集

生成数据集
X, y=mglearn.datasets.make_forge()
#数据集绘图
mglearn.discrete_scatter(X[:,0], X[:, 1], y)
plt.legend(["Class 0","Class 1"],loc=4)#生成图例的位置
plt.xlabel("First feature")
plt.ylabel("Second feature")
print("X.shape:{}".format(X.shape))

数据集可视化

可以看出这个数据集有26个数据点和2个特征

2、使用模拟数据集wave来说明回归算法

我们用模拟的wave数据集来说明回归算法。wave数据集只有一个输入特征和一个连续的目标变量(或响应),后者是模型想要预测的对象。下面绘制的图像中单一特征位于x轴,回归目标(输出)位于y轴

X, y=mglearn.datasets.make_wave(n_samples=40)
plt.plot(X, y, 'o')
plt.ylim(-3, 3)#设置刻度
plt.xlabel("Feature")
plt.ylabel("Target")

http://t.csdn.cn/8RIFchttp://t.csdn.cn/8RIFc

从低微数据集了解到的特征不一定适用于高维数据集

3、威斯康星州乳腺癌数据集(简称cancer)

里面记录了乳腺癌肿瘤的临床测量数据。每个肿瘤都被标记为“良性”(benign,表示无害肿瘤)或“恶性”(malignant,表示癌性肿瘤),其任务是基于人体组织的测量数据来学习预测肿瘤是否为恶性

from sklearn.datasets import load_breast_cancer#使用scikit-learn模块的load breast caner函数加载数据
cancer= load_breast_cancer()
print("cancer.keys():\n{}".format(cancer.keys()))

print("shape of cancer data:{}".format(cancer.data.shape))#数据含有的数据点数,每个数据点含有的特征数print("sample count per class:\n{}".format({n: v for n, v in zip(cancer.target_names, np.bincount(cancer.target))}))
#打印被标记为良性、恶性的数据点数目

了解np.bincount

http://t.csdn.cn/jS3hjhttp://t.csdn.cn/jS3hj

包含在scikit-learn中的数据集通常被保存为Bunch对象,里面包含真实数据以及一些数据集信息。关于Bunch对象,你只需要知道它与字典很相似,而且还有一个额外的好处,就是你可以用点操作符来访问对象的值(比如用bunch.key来代替bunch['key'])

print("Feature names:\n{}".format(cancer.feature_names))#打印特征名

print("cancer.DESCR:\n{}".format(cancer.DESCR))#打印cancer.DESCR了解更多信息

4、波士顿房价数据集(回归数据集)

from sklearn.datasets import load_boston#加载数据集
boston=load_boston()
print("data shape:{}".format(boston.data.shape))#打印数据集数据形状

同时也可以自行阅读DESCR属性来了解数据集的更多信息。

对于我们的目的而言,我们需要扩展这个数据集,输入特征不仅包括这13个测量结果,还包括这些特征之间的乘积(也叫交互项)。换句话说,我们不仅将犯罪率和公路可达性作为特征,还将犯罪率和公路可达性的乘积作为特征。像这样包含导出特征的方法叫作特征工程(feature engineering)。这个导出的数据集可以用load extended boston函数加载。

X, y=mglearn.datasets.load_extended_boston()
print("X.shape:{}".format(X.shape))

最初的13个特征加上这13个特征两两组合(有放回)得到的91个特征,一共有104个特征.

5、k近邻

k近邻分类

最简单版本只考虑一个最近邻,也就是与我们想要预测的数据点最近的训练数据点,预测结果就是这个训练数据点的已知输出。

在gorge数据集上应用

mglearn.plots.plot_knn_classification(n_neighbors=1)

单一最近邻模型对forge数据集的预测结果

mglearn.plots.plot_knn_classification(n_neighbors=3)

3近邻模型对forge数据集的预测结果

选择占据多数的作为预测结果。

我们发现在这样与单一近邻不同。

这样的方法适用于二分类,也适用于多分类数据集。

通过skikit-learn来应用k近邻算法

#将数据集分为训练集和测试集,以便评估泛化性能
from sklearn.model_selection import train_test_split
X, y=mglearn.datasets.make_forge()
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
#导入类并将其实例化,此时可以设定k的参数
from sklearn.neighbors import KNeighborsClassifier
clf=KNeighborsClassifier(n_neighbors=3)
#利用训练集对这个分类器进行拟合,对于KNeighborsClassifier来说就是保存数据集,以便预测时计算与邻居之间的距离。
clf.fit(X_train, y_train)
#调用predict方法来对测试数据进行预测,对于每个测试集中的每个数据点,都要计算出它在训练集中的最近邻,然后找出其中出现次数最多的类别
print("test set predictions:{}".format(clf.predict(X_test)))
#为了评估模型泛化能力好坏,我们可以对测试数据和测试标签调用score方法
print("test set accuracy:{:.2f}".format(clf.score(X_test, y_test)))
print("Test set score:{:.2f}".format(np.mean(clf.predict(X_test)==y_test)))

6、分析KNeighborsClassifier

对于二维数据集,我们还可以在xy平面上画出所有可能的测试点的预测结果。我们根据平面中每个点所属的类别对平面进行着色。这样可以查看决策边界(decisionboundary),即算法对类别0和类别1的分界线。下列代码分别将1个、3个和9个邻居三种情况的决策边界可视化。


fig, axes = plt.subplots(1, 3, figsize=(10, 3))for n_neighbors, ax in zip([1, 3, 9], axes):#fit方法返回对象本身,所以我们可以将实例化和拟合放在一行代码中clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(X, y)mglearn.plots.plot_2d_separator(clf, X, fill=True, eps=0.5, ax=ax, alpha=.4)mglearn.discrete_scatter(X[:, 0], X[:, 1], y, ax=ax)ax.set_title("{} neighbor(s)".format(n_neighbors))ax.set_xlabel("feature 0")ax.set_ylabel("feature 1")
axes[0].legend(loc=3)

随着邻居个数增多,决策边界越来越平滑,更平滑的边界意味着更简单的模型。

即使用更少的邻居对应更高的模型复杂度,更多的邻居对应更低的模型复杂度。

考虑极端情况,邻居个数等于测试集中所有数据点的个数,那么每个测试点的邻居都完全相同,所有预测结果也完全相同。

7、模型复杂度和泛化能力之间的关系

from sklearn.datasets import load_breast_cancer
cancer=load_breast_cancer()
X_train,X_test,y_train,y_test=train_test_split(cancer.data, cancer.target,stratify=cancer.target, random_state=66)
training_accuracy=[]
test_accuracy=[]
#n_neighbors取值1-10
neighbors_settings=range(1,11)
for n_neighbors in neighbors_settings:#构建模型clf=KNeighborsClassifier(n_neighbors=n_neighbors)clf.fit(X_train,y_train)
#记录训练集精度training_accuracy.append(clf.score(X_train, y_train))
#记录泛化精度test_accuracy.append(clf.score(X_test, y_test))plt.plot(neighbors_settings,training_accuracy, label="training_accuracy")
plt.plot(neighbors_settings,test_accuracy, label="test accuracy")
plt.ylabel("accuracy")
plt.xlabel("n_neighbors")
plt.legend()
#plt.show()

仅考虑单一近邻时,训练集上的预测结果十分完美。但随着邻居个数的增多,模型变得更简单,训练集精度也随之下降。单一邻居时的测试集精度比使用更多邻居时要低,这表示单一近邻的模型过于复杂。与之相反,当考虑10个邻居时,模型又过于简单,性能甚至变得更差。最佳性能在中间的某处,邻居个数大约为6

机器学习日记Day4相关推荐

  1. Python机器学习日记4:监督学习算法的一些样本数据集(持续更新)

    Python机器学习日记4:监督学习算法的一些样本数据集 一.书目与章节 二.forge数据集(二分类) 三.blobs数据集(三/多分类) 四.moons数据集 五.wave数据集(回归) 六.威斯 ...

  2. Python机器学习日记2:鸢尾花分类(持续更新)

    Python机器学习日记2:鸢尾花分类 一.书目与章节 二. 前言 1. 什么是机器学习 2. 熟悉任务和数据 3. 本文软件版本 4. scikit-learn参考资料 三. 问题类型 四. 鸢尾花 ...

  3. 机器学习 日记1 安装Python+Theano+Kera

    新人怀着对未来的无限憧憬,开始我的机器学习的学习日记 安装软件 本来我装有虚拟机,可以在ubuntu里直接装这些软件的,但奈何跟大家想法一样,想在电脑装,没办法,花了一天半的时间去搞这个玩意.参考博客 ...

  4. 机器学习日记(13)

    推荐系统(Recommender Systems) 问题形式化 推荐系统是个有趣的问题,在学术机器学习中因此,我们可以去参加一个学术机器学习会议,推荐系统问题实际上受到很少的关注,或者,至少在学术界它 ...

  5. 机器学习Sklearn Day4

     04 sklearn中的降维算法PCA和SVD 1概述 从什么叫"维度"说开来 sklearn中的降维算法 2 PCA与SVD 2.1降维究竟是怎样实现? 2.2 重要参数n_c ...

  6. Python学习日记day4 字符编码

    1.内存和硬盘都是用来存储的. CPU:速度快 硬盘:永久保存 2.文本编辑器存取文件的原理(nodepad++,pycharm) 打开编辑器就可以启动一个进程,是在内存中的,所以在编辑器编写的内容也 ...

  7. python 日记 day4。

    1.为何数据要分类 数据是用来表示状态的,不同的状态应该用不同类型的数据来表示. 2.数据类型 数字 字符串 列表 元组 字典 集合 列表:列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大 ...

  8. 阿昆同学的Java学习日记Day4

    JDBC入门 1.创建工程,导入Mysql驱动jar包 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); 3.获取链接 Connecti ...

  9. 机器学习进阶 day4

    AUC以及ROC曲线 TPR和FPR的概念 TPR真正率 分类正确的数量占总的正确的数量 FPR假正率 分类错误的数量占总的错误的数量 图例解释 equal error rate 该点是FPR=TPR ...

最新文章

  1. c语言统计输入文本不同字母单词数,【C语言统计不同单词个数编写一个程序,输入一个句子,然后统计-查字典问答网...
  2. BugkuCTF web基础$_GET
  3. (转)Unity3DUnity3D在android下调试
  4. android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...
  5. matlab plot绘制曲线
  6. 【蓝桥杯每日一练】 汉诺塔
  7. 通过ANT实现jmeter批量执行脚本、生成报告、发送邮件全套build.xml文件
  8. MySQL表自动增长列插入数据
  9. 一文读懂Xgboost
  10. 《现代控制系统》第四章——反馈控制系统特性 4.3 控制系统对参数变化的敏感程度
  11. 关闭445端口方法(解决永恒之蓝病毒)
  12. Vue File Manager – PHP即时存储、共享和获取文件基于VUE v2.2.0.2
  13. 荣耀magicbook15C语言,荣耀 MagicBook 15评测 聊聊目前性价比最高的大屏轻薄本
  14. Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 10
  15. 用 Adobe 设置 PDF 文件在文件管理器右侧预览窗格预览
  16. 封装尺寸与封装的对应关系
  17. ReactiveX-Observable
  18. SDUSTOJ 1191 - 剪子包袱锤游戏 ( 结构体 函数的巧妙应用 )
  19. 需求分析系列:软件需求分析方法论
  20. 回归问题的评价指标和重要知识点总结

热门文章

  1. unity3d坑收集
  2. 如何安全的存储用户密码
  3. 用户输入商品价格和商品数量,以及收货地址,可以自动打印订单信息 分析:
  4. JS实现网站悬浮广告
  5. 18 模块划分4步骤——EDD
  6. js onclick.点击无效解决办法
  7. 结合泛函极值_(二) 泛函的极值
  8. 【21岁扶墙当CTO】之无人机篇(1/n)
  9. 情到深处人孤独 爱至穷时尽沧桑
  10. 轻松洁净地面,还能自动清洗烘干拖布,只需一台追觅扫拖机器人