机器学习系列1-引言及相关概念

1. 机器学习是什么?

机器学习(machine learning)是从数据中提取知识,是统计学、人工智能和计算机科学交叉的研究领域,也被称为预测分析(predictive analytics)统计学习(statistical learning)

2. 为何选择机器学习?

“智能”应用早期,通过专家设定的规则体系来筛选垃圾邮件,比如设定关键字黑名单等,对某些应用来说是可行的,但是存在两个缺点:

a. 所制定的规则体系只适用于某一特定的任务,不具有普适性。

b. 想要制定规则,需要对人类专家的决策过程有很深刻的理解。

人为制定规则不适用的例子就是“人脸检测”,因为计算机感知“像素”的方式与人类感知面部的方式有很大的不同,由于这种差异,人类想要制订出一套好的规则来描述数字图像中的人脸构成,几乎是不可能的。机器学习可以解决该问题,通过想程序输入海量人脸图像,足以让算法确定识别人脸需要哪些特征。

3. 机器学习能够解决的问题 

从输入/输出对中进行学习的机器学习算法叫做监督学习算法(supervised learing algorithm),因为每个用于算法学习的样例都对应一个预期输出,好像有一个“老师”在监督着算法。虽然创建一个满足输入/输出对的大量数据集比较麻烦,但是监督学习算法很好理解,性能也易于测量,因此如果你的应用可以表示成一个监督学习的问题,那么就可以创建包含预期输出的数据集,利用机器学习来解决。

监督机器学习任务比如:识别信封上手写的邮政编码、基于医学影像判断肿瘤是否为良性、检测信用卡交易记录中的诈骗行为等。

无监督学习算法(unsupervised learing algorithm):只有输入数据是已知的,没有为算法提供输出数据。理解和评估这些算法比较困难。

无监督学习的任务比如:确定一系列博客文章的主题、将客户分成具有相似偏好的群组、检测网站的异常访问模式等。

无论是监督学习还是无监督学习,第一步都是将输入数据表征为计算机能够理解的形式。通过会将数据想象成表格,想要处理的每一个数据点(每一封邮件、每一名客户、每一次及交易等)对应表格中的一行,描述该数据点的每一项属性对应表格中的一列。在机器学习中,每个实体或每一行称为一个样本(sample)或数据点,而每一列(用来描述这些实体的属性)则被称为特征(feature)。如何创建良好的数据表征,称为特征提取(feature extraction)特征工程(feature engineering)

4. 构建机器学习解决方案

在构造机器学习解决问题的过程中,要问自己一下几个问题:

a. 我想要回答或解决的问题是什么?已经收集到的数据集能够解决这个问题吗?

b. 选用哪种方法可以比较合适的将想要解决的问题表示为机器学习的问题?(每一种算法的输入数据类型和最适合解决的问题都是不一样的)

c. 已经提取了数据的哪些特征?这些特征能够实现正确的预测?

d. 如何衡量应用是否成功?

e. 机器学习的解决方案与所研究或产品中的其他部分是如何相互影响的?(如计算机视觉与机器学习算法的关系)

5. 入门项目——鸢尾花的分类

已知鸢尾花的测量数据和品种分类,所以是一个监督学习问题。要在多个选项中预测属于其中哪一个,是一个分类(calssification)问题,可能的输出叫做类别(class)。数据集中的每朵花都属于三个类别之一,所以这是一个三分类问题。对于单个数据点来说,它的品种叫做标签(label)

模型的泛化(generalize)能力如何是指根据已有数据集训练出的模型在新数据上能否得出准确的结果。通常做法是将收集好的带标签数据分成两部分:一部分数据用于构建机器学习模型,叫做训练数据(training data)或训练集(training set),其余的数据用于评估模型性能,叫做测试数据(test data)或测试集(test set)或留出集(hold-out set)。

scikit-learn中的train_test_split函数可以打乱数据集并进行拆分,这个函数将75%的数据作为训练集,剩下25%的数据作为测试集,拆分比例是可调的,但使用25%数据作为测试集是很好的经验法则。参数random_state指定随机数生成器的种子,指定该参数可以使函数的输出固定不变。

scikit-learn中的数据通常用大写的X表示,而标签用小写的y来表示。

a. 选择算法

k近邻算法:此模型只需要保存训练集即可,要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近的数据点,然后将找到的数据点的标签赋值给这个新的数据点。其中k的含义是考虑训练集中与新数据点最近的任意k个邻居,而不是只考虑最近的那一个。

scikit-learn中所有的机器学习模型都在各自的类中实现,这些类称为Estimator类。k近邻分类算法是在neighbors模块的KNeighborClassifier类中实现的,需要将这个类实例化为一个对象,然后才能使用这个模型,同时需要设置模型的参数,最重要的参数就是邻居的数目,比如设置为1:

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)

b. 训练模型

knn对象对算法进行了封装,既包括用于训练数据构建模型的算法,也包括对新数据点进行预测的算法,还包括算法从训练数据中提取的信息。对于KNeighborClassifier来说,里面只保存了训练集。调用knn对象的fit方法就可以基于训练集来构建模型了。

knn.fit(X_train, y_train)

scikit-learn中的大多数模型都有很多参数,但多用于速度优化或非常特殊的用途。

c. 预测

调用knn对象的predict方法来进行预测:

prediction = knn.predict(X_new)
print(prediction)

d. 评估模型

评分需要用到之前拆分的测试集,这些数据没有用于构建模型。对测试集的每个数据点进行预测,并将预测结果与标签(已知的输出结果)进行对比。通过计算精度(accuracy)来衡量模型的优劣,精度就是预测正确的数据点所占的比例:

y_pred = knn.predict(X_test)
print("test set predictions:\n {}".format(y_pred))
print("test set score: {:.2f}".format(np.mean(y_pred == y_test))) 

也可以使用knn对象的score方法来计算测试集的精度:

print("test set score: {:.2f}".format(knn.score(X_test, y_test)))

e. 总结

fit、predict和score方法是scikit-learn监督学习模型中最常用的接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值