监督学习作为运用最广泛的机器学习方法, 一直以来都是从数据挖掘信息的重要手段即便是在无监督学习兴起的近日, 监督学习也依旧是入门机器学习的钥匙
这篇监督学习教程适用于刚入门机器学习的小白
当然了, 如果你已经熟练掌握监督学习, 也不妨快速浏览这篇教程, 检验一下自己的理解程度~
什么是监督学习?
在监督学习中, 我们首先导入包含有训练属性和目标属性的数据集监督学习算法会从数据集中学习得出训练样本和其目标变量之间的关系, 然后将学习到的关系对新样本 (未被标记的样本) 进行分类
为了阐明监督学习的工作原理, 我们用根据学生学习时间预测其考试成绩的例子来说明
用数学表示, 即 Y = f(X)+ C, 其中
f 表示学生学习时间和考试成绩之间的关系
X 表示输入(学习小时数)
Y 表示输出(考试分数)
C 表示随机误差
监督学习算法的终极目标是给出新的输入 X, 使得预测结果 Y 的准确率最大有很多方法可以实现有监督学习, 我们将探讨几种最常用的方法
根据给定的数据集, 机器学习可以分为两大类: 分类 (Classification) 和回归 (Regression) 如果给定的数据集的输出值是类别, 那么待解决是分类问题如果给定的数据集的输出值是连续的, 那么该问题是回归问题
举两个例子
分类: 判断是猫还是狗
回归: 房子的售价是多少?
分类
考虑这样一个例子, 医学研究员想要分析乳腺癌数据, 用于预测患者使用三种治疗方案中的哪一种该数据分析问题就属于分类问题, 通过建立分类模型来预测类别标签, 例如治疗方案 A 治疗方案 B 或者治疗方案 C
分类是一个预测类别标签的预测问题, 这些类别标签都是离散和无序的分类包含两个步骤: 学习步骤和分类步骤
分类方法和选择最优方法
一些常见的分类算法:
K 近邻
决策树
朴素贝叶斯
支持向量机
在学习步骤中, 分类模型通过分析训练集数据建立一个分类器在分类步骤中, 分类器对给定的数据进行分类用于分析的数据集 (包含数据和其对应的标签) 被划分为训练集和测试集训练集从分析用的数据集中随机抽取剩下的数据集构成测试集测试集和训练集相互独立, 即测试集中的数据不会被构建于分类器
测试集用于评价分类器的预测精度分类器的精度用测试集中预测正确的百分比表示为了获得更高的精度, 最好的方法是测试多个不同的算法, 同时, 对每个算法尝试不同的参数可以通过交互检验选择最好的算法和参数
对于给定问题, 在选取算法时, 算法的精度训练时间线性参数数目以及特殊情况都要考虑在内
在 IRIS 数据集上实现 sklearn 中的 KNN, 并对给定的输入进行花卉类型分类
首先, 要应用机器学习算法, 我们需要了解给定数据集的组成在这个例子中, 我们使用内置在 sklearn 包中的 IRIS 数据集现在让我们使用代码查看 IRIS 数据集
请确保你的电脑上成功安装了 Python 然后, 通过 PIP 安装下面这些 python 库:
- pip install pandas
- pip install matplotlib
- pip install scikit-learn
在下面这段代码中, 我们使用 pandas 中的一些方法查看 IRIS 数据集的一些属性
- from sklearn import datasets
- import pandas as pd
- import matplotlib.pyplot as plt
- # Loading IRIS dataset from scikit-learn object into iris variable.
- iris = datasets.load_iris()
- # Prints the type/type object of iris
- print(type(iris))
- # <class 'sklearn.datasets.base.Bunch'>
- # prints the dictionary keys of iris data
- print(iris.keys())
- # prints the type/type object of given attributes
- print(type(iris.data), type(iris.target))
- # prints the no of rows and columns in the dataset
- print(iris.data.shape)
- # prints the target set of the data
- print(iris.target_names)
- # Load iris training dataset
- X = iris.data
- # Load iris target set
- Y = iris.target
- # Convert datasets' type into dataframe
- df = pd.DataFrame(X, columns=iris.feature_names)
- # Print the first five tuples of dataframe.
- print(df.head())
输出:
- <class sklearn.datasets.base.Bunch>
- dict_keys([data, target, target_names, DESCR, feature_names])]
- <class numpy.ndarray> <class numpy.ndarray>
- (150, 4)
- [setosa versicolor virginica]
- sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
- 0 5.1 3.5 1.4 0.2
- 1 4.9 3.0 1.4 0.2
- 2 4.7 3.2 1.3 0.2
- 3 4.6 3.1 1.5 0.2
- 4 5.0 3.6 1.4 0.2
Sklearn 中的 K 最近邻算法
如果一个算法仅存储训练集数据, 并等待测试集数据的给出, 那么这个算法便可认为是一个懒惰学习法直到给定测试集数据, 它才会根据它与存储的训练集样本的相似性来对新样本进行分类
K 近邻分类器就是一个懒惰学习法
K 近邻基于类比学习, 比较一个测试样本和与之相似训练集数据训练集有 n 个属性表征每个样本由 n 维空间中的一个点表示这样, 训练集中的所有样本都储存在 n 维模式空间中当给定一个未知的样本, K 近邻分类器在模式空间中搜寻和未知样本最接近的 k 个训练样本这 k 个训练样本就是未知样本的 k 个近邻
接近度用距离来度量, 例如欧几里得距离较好的 K 值可以通过实验确定
在下面这段代码中, 我们导入 KNN 分类器, 将之应用到我们的输入数据中, 然后对花卉进行分类
- from sklearn import datasets
- from sklearn.neighbors import KNeighborsClassifier
- # Load iris dataset from sklearn
- iris = datasets.load_iris()
- # Declare an of the KNN classifier class with the value with neighbors.
- knn = KNeighborsClassifier(n_neighbors=6)
- # Fit the model with training data and target values
- knn.fit(iris['data'], iris['target'])
- # Provide data whose class labels are to be predicted
- X = [
- [5.9, 1.0, 5.1, 1.8],
- [3.4, 2.0, 1.1, 4.8],
- ]
- # Prints the data provided
- print(X)
- # Store predicted class labels of X
- prediction = knn.predict(X)
- # Prints the predicted class labels of X
- print(prediction)
输出:
[1 1]
其中, 0,1,2 分别代表不同的花在该例子中, 对于给定的输入, KNN 分类器将它们都预测成为 1 这个类别的花
KNN 对 IRIS 数据集分类的直观可视化
回归
回归通常被定义为确定两个或多个变量之间的相关关系例如, 你要通过给定的数据 X 预测一个人的收入这里, 目标变量是指该变量是我们关心以及想要预测的未知变量, 而连续是指 Y 的取值没有间隔
预测收入是一个经典的回归问题你的输入应当包含所有与收入相关的个人信息(比如特征), 这些信息可以预测收入, 例如工作时长教育经历职称以及他的曾住地等
回归模型
一些常见的回归模型有
线性回归
逻辑回归
多项式回归
线性回归通过拟合一条直线 (回归线) 来建立因变量 (Y) 与一个或多个自变量 (X) 之间关系
用数学公示表示, 即 h(xi) = βo + β1 * xi + e, 其中
βo 是截距
β1 是斜率
e 是误差项
用图表示, 即
逻辑回归是一种预测类别的算法, 用于找出特征和特定输出概率之间关系
当然了, 我们也可以把逻辑回归归类为分类算法, 但就像我们刚才所说, 逻辑回归的输出其实是目标对象属于某一类别的概率既然概率是连续的, 我们依旧把逻辑回归算作回归算法
用数学公式表示: p(X) = βo + β1 * X, 其中 p(x) = p(y = 1 | x)
图形表示为
多项式回归是一种将自变量 x 与因变量 y 的关系拟合为 x 的 n 阶多项式的回归算法
解决线性回归问题
我们有数据集 X, 以及对应的目标值 Y, 我们使用普通最小二乘法通过最小化预测误差来拟合线性模型
给定的数据集同样划分为训练集和测试集训练集由已知标签的样本组成, 因此算法能够通过这些已知标签的样本来学习测试集样本不包含标签, 你并不知道你试图预测样本的标签值
我们将选择一个需要训练的特征, 应用线性回归方法拟合训练数据, 然后预测测试集的输出
用 Sklearn 实现线性回归
- from sklearn import datasets, linear_model
- import matplotlib.pyplot as plt
- import numpy as np
- # Load the diabetes dataset
- diabetes = datasets.load_diabetes()
- # Use only one feature for training
- diabetes_X = diabetes.data[:, np.newaxis, 2]
- # Split the data into training/testing sets
- diabetes_X_train = diabetes_X[:-20]
- diabetes_X_test = diabetes_X[-20:]
- # Split the targets into training/testing sets
- diabetes_y_train = diabetes.target[:-20]
- diabetes_y_test = diabetes.target[-20:]
- # Create linear regression object
- regr = linear_model.LinearRegression()
- # Train the model using the training sets
- regr.fit(diabetes_X_train, diabetes_y_train)
- # Input data
- print('Input Values')
- print(diabetes_X_test)
- # Make predictions using the testing set
- diabetes_y_pred = regr.predict(diabetes_X_test)
- # Predicted Data
- print("Predicted Output Values")
- print(diabetes_y_pred)
- # Plot outputs
- plt.scatter(diabetes_X_test, diabetes_y_test, color='black')
- plt.plot(diabetes_X_test, diabetes_y_pred, color='red', linewidth=1)
- plt.show()
输入
输入值:
- [
- [ 0.07786339] [-0.03961813] [ 0.01103904] [-0.04069594]
- [-0.03422907] [ 0.00564998] [ 0.08864151] [-0.03315126]
- [-0.05686312] [-0.03099563] [ 0.05522933] [-0.06009656]
- [ 0.00133873] [-0.02345095] [-0.07410811] [ 0.01966154]
- [-0.01590626] [-0.01590626] [ 0.03906215] [-0.0730303 ]
- ]
预测的输出值:
- [
- 225.9732401 115.74763374 163.27610621 114.73638965
- 120.80385422 158.21988574 236.08568105 121.81509832
- 99.56772822 123.83758651 204.73711411 96.53399594
- 154.17490936 130.91629517 83.3878227 171.36605897
- 137.99500384 137.99500384 189.56845268 84.3990668
- ]
结语
提一下常用的监督学习的 python 库
- Scikit-Learn
- Tensorflow
- Pytorch
来源: http://click.aliyun.com/m/43515/