[python机器学习及实践(1)]Sklearn实现LR和SVM

1.  sklearn简介  

sklearn是机器学习中一个常用的python第三方模块,网址:http://scikit-learn.org/stable/index.html ,里面对一些常用的机器学习方法进行了封装,在进行机器学习任务时,并不需要每个人都实现所有的算法,只需要简单的调用sklearn里的模块就可以实现大多数机器学习任务。

 

库的算法主要有四类:分类,回归,聚类,降维。其中:

常用的回归:线性、决策树、SVM、KNN ;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
常用的分类:线性、决策树、SVM、KNN,朴素贝叶斯;集成分类:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN
常用降维:LinearDiscriminantAnalysis、PCA

2. 名词说明

P=TP+FNP=TP+FN, N=TN+FPN=TN+FP 

可以看到,recall 体现了分类模型HH对正样本的识别能力,recall 越高,说明模型对正样本的识别能力越强,precision 体现了模型对负样本的区分能力,precision越高,说明模型对负样本的区分能力越强。F1-score 是两者的综合。F1-score 越高,说明分类模型越稳健。

可以看到,当 β=1β=1,那么FβFβ就退回到F1F1了,ββ 其实反映了模型分类能力的偏好,β>1β>1 的时候,precision的权重更大,为了提高FβFβ,我们希望precision 越小,而recall 应该越大,说明模型更偏好于提升recall,意味着模型更看重对正样本的识别能力; 而 β<1β<1 的时候,recall 的权重更大,因此,我们希望recall越小,而precision越大,模型更偏好于提升precision,意味着模型更看重对负样本的区分能力。

3.例子1:实现线性分类器

样本:

https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data

csv文件形式:

#coding=utf-8
import pandas as pd
import numpy as np

from  sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import stochastic_gradient
from sklearn.metrics import classification_report


#1.数据获取
#创建特征列表
#'样品代码编号','团块厚度','细胞大小均匀性',   '细胞形状的均匀性','边缘粘附','单个上皮细胞大小',...'种类'
column_names=['Sample code number','Clump Thickness','Uniformity of Cell Size',
              'Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size',
              'Bare nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']
# 使用pandas.read_csv函数从互联网读取制定数据
data=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',names=column_names)

#打印信息
print data.info()  #查看详细信息
print data.head() #查看部分信息
print data.shape  #(699, 11)

#2.数据预处理:缺失值,标准化
#替换和去除缺失值
data=data.replace(to_replace='?',value=np.nan)  # 将?代换为标准缺失值表示 nan
data=data.dropna(how='any')  # 丢弃带有缺失值的数据(只要有一个纬度有缺失)
print data.shape   #(683, 11)

## 随机采用25%的数据用于测试,剩下的75%的数据用于训练集  random_state是随机数的种子,不同的种子会造成不同的随机采样结果,相同的种子采样结果相同
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)  #编号没有进入训练

#标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test=ss.transform(X_test)

#3.使用逻辑斯蒂回归
lr = LogisticRegression()   # 初始化LogisticRegression
lr.fit(X_train,y_train)   # 使用训练集对测试集进行训练
lr_y_predit=lr.predict(X_test)  # 使用逻辑回归函数对测试集进行预测
print ('Accuracy of LR Classifier:%f'%lr.score(X_test,y_test))   # 使得逻辑回归模型自带的评分函数score获得模型在测试集上的准确性结果
print classification_report(y_test,lr_y_predit,target_names=['Benign','Malignant'])  #良性,恶性

#4.使用逻辑斯蒂回归(基于随机梯度下降法SGD)
sgdc=stochastic_gradient.SGDClassifier(max_iter=5)  # 初始化分类器
sgdc.fit(X_train,y_train)
sgdc_y_predit=sgdc.predict(X_test)
print 'Accuarcy of SGD Classifier:', sgdc.score(X_test, y_test)
print classification_report(y_test,sgdc_y_predit,target_names=['Benign','Malignant'])

运行结果(第3,4部分):

4.例子2:实现SVM对手写数字的识别

#coding=utf-8
from sklearn.datasets import  load_digits  # 从skleran.datasets里有导入手写体数字加载器
from sklearn.model_selection import  train_test_split #导入train_test_split用于数据分割
from sklearn.preprocessing import StandardScaler  # 导入标准化数据
from sklearn.svm import LinearSVC                       # 从sklearn.svm中导入基于现行假设的支持向量机分类器LinearSVC
from sklearn.metrics import classification_report

#1.数据获取
digits = load_digits()  #从通过数据加载器获得手写数字的数码图像数据并存储在digits中
print digits.data.shape  # 检视数据规模和数据纬度

#2.数据预处理:训练集测试集分割,数据标准化
X_train,X_test,y_train,y_test = train_test_split(digits.data,digits.target,test_size=0.25,random_state=33)
print X_train
print y_train
print y_train.shape
ss = StandardScaler()                    # 对测试集和训练集进行标准化
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)

#3.使用SVM训练
lsvc = LinearSVC()                      # 初始化现行假设的支持向量机分类器 LinearSVC
lsvc.fit(X_train,y_train)                # 进行模型训练
y_predict = lsvc.predict(X_test)

#4.生成结果报告
print ('The Accuracy of Linear SVC is %f'%lsvc.score(X_test,y_test))   # 使用自带的模型评估函数进行准确性评测
print classification_report(y_test,y_predict,target_names=digits.target_names.astype(str))            # 使用sklearn.metrics里面的classification_report模块对预测结果做更加详细的分析

运行结果:

原文地址:https://www.cnblogs.com/youngsea/p/9321784.html