使用scikit-learning 实现机器学习分类算法

分类算法的选择

没有免费的午餐理论:没有任何一种分类器可以在所有可能的应用场景下都有良好的表现。

实践证明,只有比较了多种学习算法的性能,才能为特定问题挑选出最合适的模型。这些模型针对不同数量的特征或样本、数据集中噪声的数量,以及类别是否线性可分等问题时,表现各不相同。

总而言之,分类器的性能、计算能力和预测能力,在很大程度上都依赖于用于模型训练的相关数据。训练机器学习算法所涉及的五个主要步骤可概述如下:

1.特征的选择

2.确定性能评价标准

3.选择分类器及其优化算法

4.对模型性能的评估

5.算法的调优

初涉scikit-learn的使用

使用scikit-learn训练感知器

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Perceptron
from sklearn.metrics import accuracy_score
iris=datasets.load_iris()
X=iris.data[:,[,]]
y=iris.target
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=)
sc=StandardScaler()
sc.fit(X_train)
X_train_std=sc.transform(X_train)
X_test_std=sc.transform(X_test)
ppn=Perceptron(n_iter=,eta0=0.1,random_state=)
ppn.fit(X_train_std,y_train)
y_pred=ppn.predict(X_test_std)
print('Misclassified samples:%d'%(y_test!=y_pred).sum())
print('Accuracy:%.2f'%accuracy_score(y_test,y_pred))

使用scikit-learn中cross_validation模块中的train_test_split函数,随机将数据矩阵X与类标向量y按照3:7的比例分为测试数据集(45个样本)和训练数据集(105个样本)。

为了优化性能,许多机器学习和优化算法都要求对数据做特征缩放。在此,我们将使用scikit-learn的preprocessing模块中的StandardScaler类对特征进行标准化处理。使用StandardScaler中的fit方法,可以计算训练数据中每个特征的平均值和方差。通过通用transform方法,可以使用前面计算得到的平均值和方差来对训练数据做标准化处理。需注意的是,我们要使用相同的缩放参数分别处理训练和测试数据集,以保证它们的值是彼此相当的。

对于使用scikit-learn的接口训练感知器,其流程与我们在(二)中实现的感知器的流程类似:在加载了linear_model模块中的Perceptron类后,我们实例化一个新的Perceptron对象,并通过fit方法训练模型。此模型中的参数eta0与我们自行实现的感知器中的学习率eta等价,而参数n_iter定义了迭代的次数

使用scikit-learn完成模型的训练后,就可以在测试数据集上使用predict方法进行预测了

在metrics模块中,scikit-learn还实现了许多不同的性能矩阵。accuracy_score(y_test,y_pred)

逻辑斯蒂回归中的类别概率

感知器是机器学习分类算法中优雅易用的一个入门算法,不过其最大的缺点在于:在样本不是完全线性可分的情况下,它永远不会收敛。上一小节中关于分类的任务就是这样的一个例子。直观上,可以把原因归咎于:在每次迭代过程中,总是存在至少一个分类错误的样本,从而导致了权重持续更新。当然,你也可以改变学习速率并增加迭代次数,不过感知器在此类数据集上仍旧永远无法收敛。为了提高分类的效率,我们学习另外一种针对线性二分类别分类问题的简单但更高效的算法:逻辑斯蒂回归。请注意:不要被其名字所迷惑,逻辑斯蒂回归是一个分类模型,而不是回归模型。

sigmoid函数的图

import numpy as np
from sklearn.linear_model import LogisticRegression
def sigmoid(z):
return 1.0/(+np.exp(-z))
z=np.arange(-,,0.1)
phi_z=sigmoid(z)
plt.plot(z,phi_z)
plt.axvline(0.0,color='k')
plt.axhspan(0.0,,facecolor='1.0',alpha=1.0,ls='dotted')
plt.axhline(y=0.5,ls='dotted',color='k')
plt.yticks([0.0,0.5,1.0])
plt.ylim(-0.1,1.1)
plt.xlabel('z')
plt.ylabel('$\phi (z)$')
plt.show()

from sklearn.linear_model import LogisticRegression用来调用逻辑斯蒂回归模型,我们用fit方法训练数据。

使用支持向量机最大化分类间隔

一种强大且广发应用的学习算法是支持向量机(SVM),它可以看作对感知器的扩展。在感知器算法中,我们可以最小化分类误差。而在SVM中,我们的优化目标是最大化分类间隔。此外间隔是指两个分离的超平面(决策边界)间的距离,而最靠近超平面的训练样本称作支持向量。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier
from sklearn.svm import SVC
from matplotlib.colors import ListedColormap
def plot_decision_region(X,y,classifier,test_idx=None,resolution=0.02):
markers=('s','x','o','^','v')
colors=('red','blue','lightgreen','gray','cyan')
cmap=ListedColormap(colors[:len(np.unique(y))])
x1_min,x1_max=X[:,].min()-,X[:,].max()+
x2_min,x2_max =X[:, ].min() - , X[:, ].max()+
xx1,xx2=np.meshgrid(np.arange(x1_min,x1_max,resolution),np.arange(x2_min,x2_max,resolution))
Z=classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)
Z=Z.reshape(xx1.shape)
plt.contourf(xx1,xx2,Z,alpha=0.4,cmap=cmap)
plt.xlim(xx1.min(),xx1.max())
plt.ylim(xx2.min(),xx2.max()) X_test,y_test=X[test_idx,:],y[test_idx]
for idx,cl in enumerate(np.unique(y)):
plt.scatter(x=X[y==cl,],y=X[y==cl,],alpha=0.8,c=cmap(idx),marker=markers[idx],label=cl) if test_idx:
X_test,y_test=X[test_idx,:],y[test_idx]
plt.scatter(X_test[:.],X_test[:,],c='',s=,label='test set') ppn=SGDClassifier(loss='perceptron')
lr=SGDClassifier(loss='log')
svm=SGDClassifier(loss='hinge')
np.random.seed()
X_xor=np.random.randn(,)
y_xor=np.logical_xor(X_xor[:,]>,X_xor[:,]>)
y_xor=np.where(y_xor,,-)
plt.scatter(X_xor[y_xor==,],X_xor[y_xor==,],c='b',marker='x',label='')
plt.scatter(X_xor[y_xor==-,],X_xor[y_xor==-,],c='r',marker='s',label='-1')
plt.ylim(-,)
plt.legend()
plt.show()
svm=SVC(kernel='rbf',random_state=,gamma=0.1,C=)
svm.fit(X_xor,y_xor)
plot_decision_region(X_xor,y_xor,classifier=svm)
plt.legend(loc='upper left')
plt.show()

《Python机器学习》笔记(三)的更多相关文章

  1. 基于C#程序设计语言的三种组合算法

    目录 基于C#程序设计语言的三种组合算法 1. 总体思路 1.1 前言 1.2 算法思路 1.3 算法需要注意的点 2. 三种组合算法 2.1 普通组合算法 2.2 与自身进行组合的组合算法 2.3 ...

  2. python程序设计语言笔记 第一部分 程序设计基础

    1.1.1中央处理器(CPU) cpu是计算机的大脑,它从内存中获取指令然后执行这些指令,CPU通常由控制单元和逻辑单元组成. 控制单元用来控制和协调除cpu之外的其他组件的动作. 算数单元用来完成数 ...

  3. C程序设计语言笔记-第一章

     The C Programming language notes 一 基础变量类型.运算符和判断循环         char                 字符型  character      ...

  4. 《javascript高级程序设计》笔记三

    第三章 基本概念 任何语言的核心必然会描述这门语言最基本的工作原理.这部分内容对我们来说,读起来很乏味,甚至会产生困意,但这部分内容却是重要的!我有幸拜读<JavaScript高级程序设计> ...

  5. [C程序设计语言]第三部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. 精读《javascript高级程序设计》笔记三——面向对象的程序设计

    重点来了,我认为这一章值得好好地反复地看.看第一遍 还是懵懵懂懂,现在看第二遍,终于能看出点意思了. 创建对象 工厂模式 function createPerson(name, age, job){ ...

  7. 《程序设计语言——实践之路(英文第三版)》【PDF】下载

    <程序设计语言--实践之路(英文第三版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382234 内容简介 <程序设计语 ...

  8. 北京大学Cousera学习笔记--6-计算导论与C语言基础--计算机的基本原理-认识程序设计语言 如何学习

    1.是一门高级程序语言 低级语言-机器语言(二进制) 汇编语言-load add save mult 高级语言:有利于人们编写理解 2.C语言的规范定义非常的宽泛 1.long型数据长度不短于int型 ...

  9. C语言程序设计I—第三周教学

    由于本课程是从教学周的第二周开始上课,所以第二次授课是发生在第三周,为了让PTA.云班课和博客能统一,所以将教学周作为随笔的标题.本周由于处理外聘教师随意退课等事情,总结有些延后了. 第三周教学安排 ...

  10. Go语言学习笔记三: 常量

    Go语言学习笔记三: 常量 定义常量 常量就是在声明后不能再修改的量. const x int = 100 const y string = "abc" const z = &qu ...

随机推荐

  1. TensorFlow学习笔记 速记1——tf.nn.dropout

    tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None,name=None)  上面方法中常用的是前两个参数: 第一个参数 x:指输入: 第二个 ...

  2. mariadb mysql 报'Access denied for user 'root'@'localhost' (using password: NO)'错误的解决

    C:\Program Files\MariaDB 10.2\bin>mysql admin -u root password "x123456789" mysql Ver 1 ...

  3. Atitit.创建快捷方式 windows快捷方式的原理

    Atitit.创建快捷方式 windows快捷方式的原理 1. Windows中有2种快捷方式的文件:1 2. Jshortcut2 2.1. 提示新不上jshortcut.dll2 2.2. 使用w ...

  4. FPGA开发要懂得使用硬件分析仪调试——ILA

    0. ILA概述在FPGA开发中,当我们写完代码,进行仿真,确定设计没有问题后,下载到硬件上一般都能按照我们的设计意愿执行相应功能.但这也并非绝对的,有时候你会遇到一些突然情况,比如时序问题或者仿真时 ...

  5. 红茶一杯话Binder (初始篇)

    1 什么是Binder? 简单地说,Binder是Android平 台上的一种跨进程交互技术.该技术最早并不是由Google公司提出的,它的前身是Be Inc公司开发的OpenBinder,而且在Pa ...

  6. Any、AnyObject、as

    Swift中添加了两种类型别名 Any:可表示随意类型,(Int.Double等值类型). AnyObject:可表示随意class类型实例, 一个不论什么对象类型的数组 Any类型: class C ...

  7. Ubuntu17 root ssh

    Ubuntu provides OpenSSH (OpenBSD Secure Shell) in its universe repositories, which is a suite of sec ...

  8. shiro配置数据库连接池总结

    在项目中要使用shiro做权限认证和登录许可等,现在总结一份,以备以后使用 ms sql版本 [main]ds=com.mchange.v2.c3p0.ComboPooledDataSourceds. ...

  9. C++标准库之condition_variable

    conditon_variable(条件变量)用于线程间同步 condition_variable有5个函数,函数名及对应的功能如下: wait阻塞自己,等待唤醒 wait_for阻塞自己,等待唤醒, ...

  10. Servlet 编写过滤器

    Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet.Servlet 过滤 ...