使用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. 在Windows Python3.5 安装LightGBM

    LightGBM是微软旗下DMTK推出的Gradient Boosting框架,因为其快速高效,以后或许会成为数据挖掘竞赛中的又一个大杀器.地址:https://github.com/Microsof ...

  2. UDP与TCP报文格式,字段意义

    UDP报文 1.UDP有两个字段:数据字段和首部字段. 首部字段 首部字段很简单,只有8个字节,由4个字段组成,每个字段的长度都是两个字节.   1)源端口:源端口号.在需要对方回信时选用.不需要时可 ...

  3. sublime test3 安装及配置

    操作系统: Ubuntu16.04 注: 除下载及安装外,其他配置不限操作系统 1. 下载及安装 官网:https://www.sublimetext.com/ 进入官网 点击 INSTALL FOR ...

  4. 淡入淡出效果模板 js

    html文件中: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> &l ...

  5. mysql之replicate_do_table/replicate_ingore_table/replicate_wide_do_table/replicate_wide_ingore_table

    参考:http://yhqlzz.blog.51cto.com/2557314/1159084/ mysql官网:http://dev.mysql.com/doc/refman/5.1/en/repl ...

  6. Java并发编程(八)不变性

    提到不变性我首先想到的就是String这个类了. 之前学习了很多原子性以及可见性的问题:失效数据,丢失更新操作或者某个对象的状态不一致,都与多线程试图访问同一个可变的相关. 如果对象的状态不会发生改变 ...

  7. Trees in a Wood. UVA 10214 欧拉函数或者容斥定理 给定a,b求 |x|<=a, |y|<=b这个范围内的所有整点不包括原点都种一棵树。求出你站在原点向四周看到的树的数量/总的树的数量的值。

    /** 题目:Trees in a Wood. UVA 10214 链接:https://vjudge.net/problem/UVA-10214 题意:给定a,b求 |x|<=a, |y|&l ...

  8. ES6 学习笔记 (1)

    笔记来源:廖雪峰老师的javascript全栈教程 ES6:JavaScript的标准,ECMAScript在不断发展,最新版ECMAScript 6标准(简称ES6)已经在2015年6月正式发布了, ...

  9. Spring Boot MongoDB JPA 简化开发

    使用SpringBoot提供的@Repository接口,可以完成曾经需要大量代码编写和配置文件定制工作.这些以前让新手程序员头疼,让有经验的程序员引以为傲的配置,由于框架的不断完善,变得不那么重要, ...

  10. 通知:spark meetup 第六次会议在北京举行

    通知: Spark北京Meetup第六次活动(­机器学习专题) 将于北京时间3月21日 下午14:00-18:00 在微软亚太研发集团总部大厦1号楼举行,主题包括: Julien Pierre  Pr ...