导入可能用到的Python库

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import re

目标

  • 学习机器学习算法——线性分类器
  • 使用良性/恶性乳腺癌肿瘤数据集进行预测

理论学习

线性分类器

特征与分类结果存在线性关系的模型为线性分类器,模型通过累积特征和对应权值的方式决策,几何学上可看成一个n维空间中的超平面,学习的过程就是不断调整超平面的位置与倾斜程度,使该超平面可以最完美的将属于不同类别的特征点区分开,公式为:$$f(w,x,b) = w^{T}x+b$$

logistic 函数

线性分类器输出的是一个数,我们希望这个数在区间[0,1]之间,需要一个映射关系,这个映射关系就是logistic函数$$g(x) = \cfrac{1}{1 + e^{-x}}$$下面使用numpy和matplot绘制该函数的图像

x = np.linspace(start=-10,stop=10,num=1000)
y = 1 / (1 + np.exp(-x))
plt.plot(x,y)
plt.show()
logistics.png

将线性分类器公式带入logistics函数后,可得logistics回归模型$$f(x,w,b) = \cfrac{1}{1 + e{-(w{T}x+b)}}$$

优化

完成了模型的构建之后,需要对算法进行优化已确定最优的W和b参数。这时,需要一个函数用于评价现有参数的质量,这个函数应该满足以下条件

  • 连续可导(用于基于梯度的优化算法需要连续可导)
  • 当预测结果越正确时,函数取值越大;预测结果越错误时,函数取值越小(反过来也可)

对于一个logistics的线性分类器,可以将输出看做取1值的概率,那么,该分类器可以视为一个条件概率$P(y|x)$,其中w与b是分布的参数,于是我们使用最大似然估计的方法确定这个评价函数(其中y是期望输出,即正确值)$$l(w,b) = \prod ((f(w,b,x))^{y}*(1 - f(w,b,x))^{1 - y})$$

  • 是否连续可导:是
  • 当y = 0时,$l(w,b) = 1 - f(w,b,x)$,预测值越接近0,取值越大;y=1时同理

于是我们只要对$l(w,b)$进行优化,通过梯度优化的方法找到最好的w,b参数即可

代码实现

导入数据——良性/恶性乳腺癌肿瘤数据集

数据下载

data_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
data_label = """ 1. Sample code number            1id number2. Clump Thickness               1 - 103. Uniformity of Cell Size       1 - 104. Uniformity of Cell Shape      1 - 105. Marginal Adhesion             1 - 106. Single Epithelial Cell Size   1 - 107. Bare Nuclei                   1 - 108. Bland Chromatin               1 - 109. Normal Nucleoli               1 - 1010. Mitoses                       1 - 1011. Class                         2 for benign, 4 for malignant)
"""
data_label = [re.sub(r"\s+\d","",x[2:]) for x in re.findall(r"\. [\w\s]+\d",data_label)]
print(data_label)
data = pd.read_csv(data_url,names=data_label)
print(data[:5],data.shape)
['Sample code numberid 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']Sample code numberid number  Clump Thickness  Uniformity of Cell Size  \
0                      1000025                5                        1
1                      1002945                5                        4
2                      1015425                3                        1
3                      1016277                6                        8
4                      1017023                4                        1   Uniformity of Cell Shape  Marginal Adhesion  Single Epithelial Cell Size  \
0                         1                  1                            2
1                         4                  5                            7
2                         1                  1                            2
3                         8                  1                            3
4                         1                  3                            2   Bare Nuclei  Bland Chromatin  Normal Nucleoli  Mitoses  Class
0           1                3                1        1      2
1          10                3                2        1      2
2           2                3                1        1      2
3           4                3                7        1      2
4           1                3                1        1      2   (699, 11)

清洗数据(去除有缺失的数据)

data = data.replace(to_replace="?",value=np.nan)
data = data.dropna(how='any')
print(data.shape)
(683, 11)

切分数据集(75%训练-25%测试)

from sklearn.cross_validation import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data[data_label[:10]],data[data_label[10]],test_size=0.25,random_state=1)
print(x_train.shape,x_test.shape)
print(y_train.shape,y_test.shape)
(512, 10) (171, 10)
(512,) (171,)

sklearn.cross_validation中的train_test_split()函数用于切分数据集,输入参数为:

  • 数据
  • 标签
  • test_size:0~1之间,表示测试集占总数据的比例
  • random_state:随机种子

数据标准化

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
x_train_norm = ss.fit_transform(x_train)
x_test_norm = ss.transform(x_test)
  • StandardScalerfit_transform()函数,先计算均值与方差再标准化
  • StandardScalertransform()函数,使用fit_transform()计算出的均值方差标准化

模型建立与训练

模型建立

logistics分类器

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()

SGD分类器

from sklearn.linear_model import SGDClassifier
sgdc = SGDClassifier()
c:\users\qiank\appdata\local\programs\python\python35\lib\site-packages\sklearn\linear_model\stochastic_gradient.py:84: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3."and default tol will be 1e-3." % type(self), FutureWarning)

训练模型

logistics分类器

lr.fit(x_train_norm,y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,penalty='l2', random_state=None, solver='liblinear', tol=0.0001,verbose=0, warm_start=False)

SGD分类器

sgdc.fit(x_train_norm,y_train)
SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,eta0=0.0, fit_intercept=True, l1_ratio=0.15,learning_rate='optimal', loss='hinge', max_iter=5, n_iter=None,n_jobs=1, penalty='l2', power_t=0.5, random_state=None,shuffle=True, tol=None, verbose=0, warm_start=False)

模型测试

from sklearn.metrics import

logistics分类器

print(lr.score(x_test_norm,y_test))
y_result = lr.predict(x_test_norm)
print(classification_report(y_test,y_result,target_names=['Benign','Malignant']))
0.988304093567precision    recall  f1-score   supportBenign       0.98      1.00      0.99       111Malignant       1.00      0.97      0.98        60avg / total       0.99      0.99      0.99       171

SGD分类器

print(sgdc.score(x_test_norm,y_test))
y_result = sgdc.predict(x_test_norm)
print(classification_report(y_test,y_result,target_names=['Benign','Malignant']))
0.970760233918precision    recall  f1-score   supportBenign       0.96      1.00      0.98       111Malignant       1.00      0.92      0.96        60avg / total       0.97      0.97      0.97       171
  • classification_report()用于测试准确率,精确率和召回率
  • .score()用于评估本模型的准确率

基于sklearn的线性分类器相关推荐

  1. sklearn实现lda模型_运用sklearn进行线性判别分析(LDA)代码实现

    基于sklearn的线性判别分析(LDA)代码实现 一.前言及回顾 本文记录使用sklearn库实现有监督的数据降维技术--线性判别分析(LDA).在上一篇LDA线性判别分析原理及python应用(葡 ...

  2. 机器学习之基于Fisher线性分类器实现多类人脸的识别

    基于 ORL 人脸库,基于 Fisher 线性分类器实现多类人脸的识别问题. 本次实验相比起之前的二分类人脸识别问题,复杂很多.而且程序的识别效果并不好,应该是程序本身的问题,各位路过的大佬仅当做参考 ...

  3. 基于sklearn的LogisticRegression鸢尾花多类分类实践

    文章目录 1. 问题描述 2. 数据介绍 2.1 数据描述 2.2 数据 2.3 数据可视化 3. 模型选择 3.1 固有的多类分类器 3.2 1对多的多类分类器 3.3 OneVsRestClass ...

  4. 【人工智能】Fisher 线性分类器的设计与实现(QDU)

    [人工智能]Astar算法求解8数码问题(QDU) [人工智能]利用α-β搜索的博弈树算法编写一字棋游戏(QDU) [人工智能]Fisher 线性分类器的设计与实现(QDU) [人工智能]感知器算法的 ...

  5. 第十九课.基于sklearn的SVM人脸识别

    目录 数据集 确定人脸的类别标记 划分训练集和测试集与训练 实验为基于sklearn的SVM人脸识别,使用 SVM 算法对戴眼镜的人脸和不戴眼镜的人脸进行分类,从而完成 识别戴眼镜的人脸 的任务:实验 ...

  6. Fisher 线性分类器--转

    原文地址:http://blog.csdn.net/htyang725/article/details/6571550 Fisher 线性分类器由R.A.Fisher在1936年提出,至今都有很大的研 ...

  7. python 线型_CCF 202006-1 线性分类器 python

    题目: 线性分类器(line) [题目描述] 考虑一个简单的二分类问题--将二维平面上的点分为A和B两类. 训练数据包含n个点,其中第i个点(1≤i≤n)可以表示为一个三元组(x,y,type),即该 ...

  8. 第 19 次 CCF CSP 认证 202006-1 线性分类器(line)

    目录 [题目描述] [输入格式] [输出格式] [样例 1 输入] [样例 1 输出] [样例 1 解释] [子任务] 思路分析: C++代码: [题目描述] 考虑一个简单的二分类问题--将二维平面上 ...

  9. 机器学习--python代码实现基于Fisher的线性判别(鸢尾花数据集的分类)

    一.线性分类–判断该函数属于哪一类 先上例题,然后我会通过两种方法来判断该函数属于哪一类 1.图解法 定义 对于多类问题:模式有 ω1 ,ω2 , - , ωm 个类别,可分三种情况: 第一种情况:每 ...

  10. 【火炉炼AI】机器学习008-简单线性分类器解决二分类问题

    [火炉炼AI]机器学习008-简单线性分类器解决二分类问题 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplot ...

最新文章

  1. CentOS4 可用镜像及更新方式
  2. Android 6.0 Changes
  3. win10 创建python虚拟环境
  4. P2153 晨跑,费用流裸题
  5. CCF CSP 201403-1 相反数(C++)
  6. 驱动开发 环境搭建(VS2008+WDK+DDKWzard)
  7. 演练 望炉山瀑布文字样式 0929
  8. 诗与远方:无题(二十一)
  9. LeetCode OJ:Linked List Cycle(链表循环)
  10. ubunut 安装 pyqt5
  11. linux内核编程--4netfiter钩子函数
  12. 如何使用JavaScript替换DOM元素?
  13. 概率假设密度滤波 matlab,概率假设密度滤波的物理空间意义
  14. 怎么防治计算机病毒,计算机病毒怎么防治
  15. Matlab:16进制excel转2进制mat
  16. 图说当下——人生感悟
  17. 4.4 day14 内置函数
  18. H3C服务器配置raid
  19. 雷达图-高效数据解读
  20. Qt快捷键之大小写切换

热门文章

  1. 简单谈一谈git小乌龟操作
  2. java 获取 jsp 内容_JAVA记录-JSP内容
  3. python如何下载os库_python下载os库的方法
  4. 免费mysql_MySql 所有的版本都是免费的吗?
  5. 凯撒密码转化,循环,C语言版!
  6. 最简单的凯撒密码(C++)
  7. python文本分割_python实现大文本文件分割
  8. Web基础配置篇(九): 抓包工具的介绍、安装及基本使用
  9. 开发者必装的软件工具总结
  10. 中国智能汽车行业市场需求趋势与发展战略规划建议报告2022-2028年版