sickit-learn库实现机器学习

sickit-learn库实现机器学习

[TOC]

Iris数据集

from sklearn import datasets
iris=datasets.load_iris()
# 数据
iris.data
# 种类
iris.target
# 种类名称
iris.target_name

借用matplotlib绘制散点图

iris.data 中四个值分别为:萼片的长宽,花瓣的长宽

萼片的图像分布

import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from sklearn import datasets

iris=datasets.load_iris()
x=iris.data[:,0]
y=iris.data[:,1]
species=iris.target

x_min,x_max=x.min() - .5, x.max() + .5
y_min,y_max=y.min() - .5, x.max() + .5

plt.figure()
plt.title('iris')
plt.scatter(x,y,c=species)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
plt.xticks(())
plt.yticks(())

修改一下得到花瓣的数据图像

import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from sklearn import datasets

iris=datasets.load_iris()
x=iris.data[:,2]
y=iris.data[:,3]
species=iris.target

x_min,x_max=x.min() - .5, x.max() + .5
y_min,y_max=y.min() - .5, x.max() + .5

plt.figure()
plt.title('iris')
plt.scatter(x,y,c=species)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
plt.xticks(())
plt.yticks(())

发现这样比较集中

主成分分解PCA

# scikit-learn库中 fit_transform()用来降维的 n_components指定降到几维

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.decomposition import PCA

iris=datasets.load_iris()
x=iris.data[:,1]
y=iris.data[:,2]
species=iris.target
x_reduced=PCA(n_components=3).fit_transform(iris.data)

fig=plt.figure()
ax=Axes3D(fig)
ax.set_title("PCA",size=15)
ax.scatter(x_reduced[:,0],x_reduced[:,1],x_reduced[:,2],c=species)
ax.set_xlabel('first')
ax.set_ylabel('second')
ax.set_zlabel('third')

ax.w_xaxis.set_ticklabels(())
ax.w_yaxis.set_ticklabels(())
ax.w_zaxis.set_ticklabels(())

K-近邻分类器

选用150中的140作为训练集,10作为测试集

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 as KNC
knn=KNC()
knn.fit(x_train,y_train)
# 预测
knn.predict(x_test)
y_test

可以发现错误率10%只有一个错了

决策边界

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier

iris=datasets.load_iris()
x=iris.data[:,2:4]
y=iris.target

x_min=x[:,0].min() - .5 
x_max=x[:,0].max() + .5

y_min=x[:,1].min() - .5
y_max=x[:,1].max() + .5

cmap_light=ListedColormap(['#FF83FA','#EEEE00','#CAE1FF'])
h = .02

xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))

knn = KNeighborsClassifier()
knn.fit(x,y)
Z=knn.predict(np.c_[xx.ravel(),yy.ravel()])
Z=Z.reshape(xx.shape)

plt.figure()
plt.pcolormesh(xx,yy,Z,cmap=cmap_light)

# plot the trainging points
plt.scatter(x[:,0],x[:,1],c=y)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())

Diabetes数据集

# 导入
from sklearn import datasets
diabetes=datasets.load_diabetes()

数据说明

包含了442个病人的生理数据和发展情况,前十个为生理数据,

  • 年龄
  • 性别
  • 体质指数
  • 血压
  • 六种血清化验数据
>>> diabetes.data[0]
array([ 0.03807591,  0.05068012,  0.06169621,  0.02187235, -0.0442235 ,
       -0.03482076, -0.04340085, -0.00259226,  0.01990842, -0.01764613])

这些数据已经做过均值中心化处理,原有信息没有丢失

扫描二维码关注公众号,回复: 1457183 查看本文章

线性回归: 最小平方回归

线性回归: y=a*x+c

用scikit-learn库中的线性回归模型预测模型

导入linear_modal 模块,LinearRegression()构造模型

from sklearn import linear_model
linreg=linear_model.LinearRegression()
from sklearn import datasets
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)
# 调用预测模型上coef_属性得到10种数据的回归系数b
linreg.coef_
# 开始预测
linreg.predict(x_test)
# 用方差来对结果进行测评:0.58
linreg.score(x_test,y_test)

为了对训练集有一个全面认识,对10个模型进行绘图

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn import datasets
# %matplotlib inline
diabetes=datasets.load_diabetes()
x_train=diabetes.data[:-20]
y_train=diabetes.target[:-20]
x_test=diabetes.data[-20:]
y_test=diabetes.target[-20:]
plt.figure(figsize=(8,12))
for f in range(0,10):
    xi_test=x_test[:,f]
    xi_train=x_train[:,f]
    xi_test=xi_test[:,np.newaxis]
    xi_train=xi_train[:,np.newaxis]
    linreg=linear_model.LinearRegression()
    linreg.fit(xi_train,y_train)
    y=linreg.predict(xi_test)
    plt.subplot(5,2,f+1)
    plt.scatter(xi_test,y_test,color='k')
    plt.plot(xi_test,y,color='b',linewidth=2)

支持向量机

SVM算法是二院或者判别模型,最基础任务是判断数据是属于两类中的哪一类

  • SVR回归问题
  • SVC向量分类
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算法之前,用SVC构造函数定义模型,然后调用fit()函数传入训练集作为参数,最后用decision_function()绘制决策边界

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)
# 画三维等高线的两个函数,contourf填充等高线之间的空隙颜色
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)

得到了图像

image

怎么预测:

svc.predict([2.0,0])

非线性SVC

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',C=1,degree=3).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)
# 画三维等高线的两个函数,contourf填充等高线之间的空隙颜色
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)

image

支持向量回归SVR

使用Diabetes数据集

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn import datasets

diabetes=datasets.load_diabetes()
# 分为训练集和测试
x_train=diabetes.data[:-20]
y_train=diabetes.target[:-20]
x_test=diabetes.data[-20:]
y_test=diabetes.target[-20:]

x0_test=x_test[:,2]
x0_test=x_train[:,2]
x0_test=x_test[:,np.newaxis]
x0_train=x_test[:,np.newaxis]

x0_test.sort(axis=0)
x0_test=x0_test*100
x0_train=x0_train*100

svr=svm.SVR(kernel='linear',C=1000)
svr2=svm.SVR(kernel='poly',C=1000,degree=2)
svr3=svm.SVR(kernel='poly',C=1000,degree=3)

svr.fit(x0_train,y_train)
svr2.fit(x0_train,y_train)
svr3.fit(x0_train,y_train)

y=svr.predict(x0_test)
y2=svr2.predict(x0_test)
y3=svr3.predict(x0_test)

plt.scatter(x0_test,y,color='k')
plt.plot(x0_test,y,color='b')
plt.plot(x0_test,y2,color='r')
plt.plot(x0_test,y3,color='g')

猜你喜欢

转载自www.cnblogs.com/pprp/p/9135504.html
今日推荐