python 机器学习之有监督学习

有监督学习(Supervised learning)可分为回归(Regression)和分类(Classification)。回归问题通常是用来预测一个值,如预测房价、未来的天气情况等等;分类问题是用于将事物打上一个标签,通常结果为离散值。分类通常是建立在回归之上,最后再使用一个函数来判别。
一张图说明如何选择模型:
这里写图片描述
1、分类问题又可以细分为线性分类和非线性分类。典型的线性分类器有感知机,LDA,逻辑斯特回归,SVM(线性核);典型的非线性分类器有朴素贝叶斯(有文章说这个本质是线性的,http://dataunion.org/12344.html),kNN,决策树,SVM(非线性核)
本次主要研究线性分类器,结合具体的例子,再加上博主的一点理解

1.1、逻辑斯特回归:
模型介绍:
线性分类器(Linear Classification),假设特征和分类结果存在线性关系的模型。通过计算每个维度的特征与各自权重的乘积来帮助决策
可以使用函数表示:f(w,x,b)=wT*x+b

 x=<x1,x2,...,xn>对应n维的特征向量,w=<w1,w2,...,wn>代表权值向量

这里f属于实数域R,但是我们想要得到对应的分类,我们就可以使用Logistic函数这里写图片描述
将结果变换到[0,1]区间,通过指定阈值,从而得到判定的类别。
下面借用Andrew Ng的公开课上使用的肿瘤预测的例子来应用模型:

  • 数据说明:使用Logistic进行训练,并对训练的结果进行评测本次利用的数据可以到网上进行下载,点击浏览
import pandas as pd
import numpy as np
#使用sklearn.cross_validation中的train_test_split进行数据分割,分割训练数据和测试数据
from sklearn.cross_validation import train_test_split
#导入Logistic模块
from sklearn.linear_model import LogisticRegression
#StandardScaler模块可以进行数据的标准化
from sklearn.preprocessing import StandardScaler
#sklearn .metrics中的classification_report可以对预测的结果进行评测,可以计算准确率、召回率以及F1指标
from sklearn .metrics import classification_report

column_names=['sample code number','clump Thickness','Uniformity of cell','uniformity of cell shape',
              'marginal adhesion','SEC','BN','BC','NN','MOT','CLASS']
data=pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',
                 names=column_names)
#数据替换
data=data.replace(to_replace='?',value=np.nan)
#丢弃带有缺失值的数据
data=data.dropna(how='any')
print(data.shape)
#使用sklearn.cross_validation将数据进行切分,25%用于测试,75%用于训练
x_train,x_test,y_train,y_test=train_test_split(data[column_names[1:10]],data[column_names[10]],
                                             test_size=0.25,random_state=33)
#标准化数据,保证每个维度方差为一,均值为0,符合正态分布
ss=StandardScaler()
x_train=ss.fit_transform(x_train)
x_test=ss.transform(x_test)

#使用罗杰斯地回归估计,首先进行模型的初始化工作
lr=LogisticRegression()
#对模型进行训练,训练的结果将保存在lr中
lr.fit(x_train,y_train)
lr_y_predict=lr.predict(x_test)


print('Accuracy of Lr calssification',lr.score(x_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','malignant']))
#输出结果如下
Accuracy of Lr calssification 0.988304093567
             precision    recall  f1-score   support

     Benign       0.99      0.99      0.99       100
  malignant       0.99      0.99      0.99        71

avg / total       0.99      0.99      0.99       171

线性分类器受限于数据特征和分类目标之间的假设,但是很多情况下我们都可以使用。Logistic回归采取精确计算的方式,当数据量较小的时候比较适合,当数据超过一定量之后,建议采取随机梯度算法
1.2、支持向量分类器(Support Vector Classifier)
根据样本的空间分布,寻找分类器最佳的哪个,使得将数据能够区分开来,如下图,可以看出起关键作用的是处于两类分界平面的最近的两个点。把这类能过真正帮助决策最优线性分类模型的数据点叫做“支持向量”
这里写图片描述

  • 数据说明:邮票的手写数字识别问题,可以用机器学习的方法代替人工,这样可以大大提高工作的效率、识别率。python里面已经集成了手写字体,在sklearn.datasets的load_digits中
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 27 16:49:54 2017

@author: mynumber
"""
#导入数据
from sklearn.datasets import load_digits
#导入数据分割的模块
from sklearn.cross_validation import  train_test_split
#数据标准化的模块
from sklearn.preprocessing import StandardScaler
#支持向量机模型
from sklearn.svm import LinearSVC
#sklearn .metrics中的classification_report可以对预测的结果进行评测,可以计算准确率、召回率以及F1指标
from sklearn.metrics import classification_report

digits=load_digits()
digits.data.shape
#使用sklearn.cross_validation将数据进行切分,25%用于测试,75%用于训练
x_train,x_test,y_train,y_test=train_test_split(digits.data,digits.target,test_size=0.25,random_state=33)
#标准化数据,保证每个维度方差为一,均值为0,符合正态分布
ss=StandardScaler()
x_train=ss.fit_transform(x_train)
x_test=ss.transform(x_test)

#训练数据,得到预测结果
lsvc=LinearSVC()
lsvc.fit(x_train,y_train)
y_predict=lsvc.predict(x_test)

#对训练结果进行评测
print('The Accuracy of Linear SVC is ',lsvc.score(x_test,y_test))
print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))
#评测结果:
The Accuracy of Linear SVC is  0.953333333333
             precision    recall  f1-score   support

          0       0.92      1.00      0.96        35
          1       0.96      0.98      0.97        54
          2       0.98      1.00      0.99        44
          3       0.93      0.93      0.93        46
          4       0.97      1.00      0.99        35
          5       0.94      0.94      0.94        48
          6       0.96      0.98      0.97        51
          7       0.92      1.00      0.96        35
          8       0.98      0.84      0.91        58
          9       0.95      0.91      0.93        44

avg / total       0.95      0.95      0.95       450

SVM在机器学习的领域中发展了很久,主要原因在于精妙的假设,可以帮助我们在大量甚至高维的数据中选择最有效的少量数据,可以有效的节省内存,同时也提高了训练的性能。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值