##机器学习
### 有监督学习和无监督学习
- 根据数据和所要创建的模型的类型,学习问题可以分为两大类。
- 有监督学习。训练集包含作为预测结果(目标值)的额外的属性信息。这些信息可以指导模型对新数据(测试集)作出跟已有数据类似的预测结果。
- 分类:训练集数据属于两种或以上类别;已标注的数据可指导系统学习能够识别每个类别的特征。预测系统未见过的新数据时,系统将根据新数据的特征,评估它的类别。
- 回归:被预测结果为连续型变量。最易于理解的应用场景是,在散点图中找岀能够描述系列数据点趋势的直线。
- 无监督学习。训练集数据由一系列输人值κ组成,其目标值未知。
- 聚类:发现数据集中由相似的个体组成的群组。
- 降维:将高维数据集的维数减少到两维或三维,这样不仅便于数据可视化,而且大幅降低维度后,每一维所传达的信息还会更多。
###用 scikit-learn实现有监督学习
- 用Iris数据集讲解分类
- K近邻分类器
- 支持向量分类(SVC)
- 用 Diabetes数据集介绍回归算法
- 线性回归
- 支持向量回归(SVR)
- 有监督学习方法从数据集读取数据,学习两个或以上特征之间可能的模式;因为训练集结果(目标或标签)已知,所以学习是可行的。 scikit-learn的所有模型都被称作有监督估计器,训练估计器要用到fit(x,y)函数:其中x指观察到的特征,y指的是目标。估计器经过训练后,就能预测任何标签未知的新数据x的y值;预测是由 predict(x)函数完成的。
### Iris数据集
- 鸢尾花数据集采集的是鸢尾花的测量数据以及其所属的类别
测量数据包括: 萼片长度、萼片宽度、花瓣长度、花瓣宽度
类别共分为三类: Iris Setosa,Iris Versicolour,Iris Virginica, 该数据集可用于多分类问题。
```py
from sklearn import datasets
iris = datasets.load_iris()
iris.data
iris.target
iris.target_names
```
- 绘制散点图
###主成分分解
##K近邻分类器
- 分类器要完成的任务是,给定一种鸢尾花卉的测量数据,为这种花卉分类。最简单的分类器是近邻分类器。近邻算法搜索训练集,寻找与用作测试的新个体最相似的观测记录。
- 训练集:
- 测试集:
- 如果确实只有一个数据集,这也没关系,重要的是不要使用相同的数据进行训练和测试。鉴于此,把数据集分成两份:一份专门用于训练算法,另一份用于验证算法。
- random. permutation():函数打乱数据集的所有元素。
其中前140条用作训练集,剩余10条用作测试集。
```py
import numpy as np
from sklearn import datasets
np.random.seed(0)
iris = datasets.load_iris()
x =iris.data
y= iris.target
i = np.random.permutation(len(iris.data))
x_train= x[i[:-10]]
y_train = y[i[: -10]]
x_test = x[i[-10:]]
y_test = y[i[-10: ]]
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(x_train, y_train)
k = knn.predict(x_test)
print(k)
print(y_test)
```
###画出决策边界
##Diabetes数据集
```
from sklearn import datasets
diabetes = datasets.load_diabetes()
```
- 前10列数值为生理数据,分别表示以下特征:
- 年龄,性别,体质指数,血压
- S1、S2、S3、S4、S5、S6(六种血清的化验数据)
##线性回归:最小平方回归
- 线性回归指的是用训练集数据创建线性模型的过程。最简单的形式则是基于下面这个用参数和c刻画的直线方程。在计算参数a和时,以最小化残差平方和为前提。
```
y=a*x+c
```
- 上述表达式中,x为训练集,y为目标值,a为斜率,c为模型所对应的直线的截距。
- 使用线性回归预测模型:
```py
from sklearn import linear_model
linering = linear_model.LinearRegression()
```
```py
from sklearn import datasets
from sklearn import linear_model
linreg = linear_model.LinearRegression()
diabetes = datasets.load_diabetes()
x_train = diabetes.data[:-20]
y_train = diabetes.target[: -20]
x_test = diabetes.data[-20:]
y_test = diabetes.target[-20:]
linreg.fit(x_train,y_train)
linreg.coef_
linreg.predict(x_test)
linreg.score(x_test,y_test)
```
###用线性回归方法单个生理因素与目标值之间的关系
##支持向量机
- SVM分类器是二元或判别模型,对两类数据进行区分。它最基础的任务是判断新观测数据属于两个类别中的哪一个。
- 在学习阶段,这类分类器把训练数据映射到叫作决策空间( decision space)的多维空间,创建叫作决策边界的分离面,把决策空间分为两个区域。
- 在最简单的线性可分的情况下,决策边界可以用平面(3D)或直线(2D)表示。在更复杂的情况中,分离面为曲面,形状更为复杂。
- SVM算法既可用于回归问题,比如SVR( Support Vector Regression,支持向量回归);也可用于分类,比如SvC( Support Vector Classification,支持向量分类)
- 二维空间线性分类问题,其决策边界为条直线,它把决策区域一分为二。
- 用一个简单的训练集举个例子,它里面的数据点分属两个类别。训练集共包含11个数据点(观测到的数据).有取值范围均为0到4的两个不同属性。这些数据点的属性值存放在叫作x的 NumPy数组中。数据点所属的类别用0或1表示,类别信息存储在数组y中。把这些数据点绘制成散点图,观察它们在空间上的分布情况,该空间可以被称为决策空间。
```py
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
x=np.array([[1,3],[1,2],[1,1.5],[1.5,2],[2,3],[2.5,1.5],[2,1],[3,1],[3,2],[3.5,1],[3.5,3]])
y = [0]*6+[1]*5
plt.scatter(x[:,0], x[:,1], c=y, s=50, alpha=0.9)
```
- 定义好了训练集,就可以使用SVC算法进行训练了。该算法将会创建一条直线(决
策边界),把决策区域分成两部分,直线所处的位置应该使得训练集中距离直线最近的几个数据点到直线的距离最大化。使用该条件,应该能够将数据点分成两部分,每一部分中所有数据点的类别相同。
- 用训练集训练SC算法之前,先用sv()构造函数定义模型,我们使用线性内核。(内核指用于模式分析的一类算法。)然后调用fit()函数,传入训练集作为参数。模型训练完成后,用decision_ function()函数绘制决策边界。绘制散点图时,注意决策空间的两部分使用不同颜色。
```py
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
x=np.array([[1,3],[1,2],[1,1.5],[1.5,2],[2,3],[2.5,1.5],[2,1],[3,1],[3,2],[3.5,1],[3.5,3]])
y = [0]*6+[1]*5
svc = svm.SVC(kernel='linear').fit(x, y)
X,Y=np.mgrid[0:4:200j,0:4:200j]
Z= svc.decision_function(np. c_[X.ravel(),Y.ravel()])
Z = Z.reshape(X.shape)
plt.contourf(X, Y, Z>0,alpha=0.4)
plt.contour(X, Y, Z, colors=['k'],linestyles=['-'],levels=[0])
plt.scatter(x[:, 0],x[:, 1], c=y, s=50, alpha=0.9)
```
- 模型一旦训练完成,理解模型是如何进行预测的就很容易了。我们拿图来说,新观察到的数据点该分到哪一部分,取决于数据点在图中的位置。
- 反之,从偏程序设计的角度来说, predict()函数将会以数值形式返回数据点所属的类别(0为用蓝色表示的那一类,1为用红色表示的类)
```
svc.predict([1.5 ,2.5])#报错
```
- 正则化是一个与SVC算法相关的概念,用参数C来设置:〔值较小,表示计算间隔时,将分界线两侧的大量甚至全部数据点都考虑在内(泛化能力强);C值较大,表示只考虑分界线附近的数据点(泛化能力弱)若不指定值,默认它的值为1。你可以通过 support_vectors数组获取到参与计算间隔的数据点,为其添加高亮效果。
##非线性SVC
- SVC线性算法,它旨在定义一条把数据分为两类的分界线。还有一些更为复杂的SVC算法,它们能够建立曲线(2D)或曲面(3D).所依据的原则依旧是最大化离表面最近的数据点之间的距离。
- 使用多项式内核的系统,正如其名称所暗示的,可以定义一条多项式曲线把决策空间分成两块。多项式的次数可用degree选项指定。即使是非线性SVC,C依旧是正则化回归系数。我们尝试使用内核为三次多项式、回归系数C取1的SⅤC算法。
```py
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
x=np.array([[1,3],[1,2],[1,1.5],[1.5,2],[2,3],[2.5,1.5],[2,1],[3,1],[3,2],[3.5,1],[3.5,3]])
y = [0]*6+[1]*5
svc = svm.SVC(kernel='poly').fit(x, y)
X,Y=np.mgrid[0:4:200j,0:4:200j]
Z= svc.decision_function(np.c_[X.ravel(),Y.ravel()])
Z = Z.reshape(X.shape)
plt.contourf(X, Y, Z>0,alpha=0.4)
plt.contour(X, Y, Z, colors=['k','k','k'],linestyles=['-','-''-'],levels=[-1,0,1])
plt.scatter(svc.support_vectors_[:,0],svc.support_vectors_[:,1],s=120,facecolors='none')
plt.scatter(x[:, 0],x[:, 1], c=y, s=50, alpha=0.9)
```
- 另外一种非线性内核为径向基函数( Radial Basis Function,RBF)。这种内核生成的分隔面尝试把数据集的各个数据点分到沿径向方向分布的不同区域。
```py
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
x=np.array([[1,3],[1,2],[1,1.5],[1.5,2],[2,3],[2.5,1.5],[2,1],[3,1],[3,2],[3.5,1],[3.5,3]])
y = [0]*6+[1]*5
svc = svm.SVC(kernel='rbf').fit(x, y)
X,Y=np.mgrid[0:4:200j,0:4:200j]
Z= svc.decision_function(np.c_[X.ravel(),Y.ravel()])
Z = Z.reshape(X.shape)
plt.contourf(X, Y, Z>0,alpha=0.4)
plt.contour(X, Y, Z, colors=['k','k','k'],linestyles=['-','-''-'],levels=[-1,0,1])
plt.scatter(svc.support_vectors_[:,0],svc.support_vectors_[:,1],s=120,facecolors='none')
plt.scatter(x[:, 0],x[:, 1], c=y, s=50, alpha=0.9)
```
##绘制SVM分类器对ris数据集的分类效果图
- SVC算法对更复杂的数据集的分类情况。
- 使用之前用过的Iris数据集。
- 前面用过的SVC算法从仅包含两个类别的训练集中学习。接下来这个例子中,我们把它扩展到三个类别,因为Iris数据集包含三个类别,对应三种花卉。
对于这个数据集,决策边界相互交叉,把决策空间(2D)或决策体(3D)分成多个部分两个线性模型均有线性决策边界(相交的超平面),而使用非线性内核的模型(多项式或高斯RBF)有非线性决策边界,后者在处理依赖于内核和参数的数据时更为灵活。
##支持向量回归
- SVC方法经扩展甚至可用来解决回归问题,这种方法称作支持向量回归(Support VectorRegression,SⅤR)SVC生成的模型实际上没有使用全部训练集数据,而只是使用其中一部分,也就是离决策边界最近的数据点。类似地,SVR生成的模型也只依赖于部分训练数据。
- SVR算法是如何使用 Diabetes数据集的,只考虑第三个生理数据。我们使用三种不同的回归算法:线性和两个非线性(多项式)。使用线性内核的SVR算法将生成一条直线作为线性预测模型,非常类似于前面见过的线性回归算法,而使用多项式内核的SVR算法生成二次和三次曲线。SVR(函数几乎与前面见过的vC(函数
完全相同。
- 唯一需要考虑的就是测试集数据必须按升序形式排列。