• [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模块对预测结果做更加详细的分析

    运行结果:

  • 相关阅读:
    jmeter压力测试报错:java.net.BindException: Address already in use: connect
    C# 对话框总结(转载)
    C# 文件操作方法大全(转载)
    C#实现进度条progress control(转载)
    在Windows下架设FTP服务器
    .Net环境下,使用installutil.exe注册、删除windows服务
    用双网卡实现跨网段访问(转载)
    HTTP协议详解(转载)
    学习开发web服务(转载)
    C# 实现http协议的GET和POST请求(转载)
  • 原文地址:https://www.cnblogs.com/youngsea/p/9321784.html
Copyright © 2020-2023  润新知