为什么写本博客
前人种树,后人乘凉。希望自己的学习笔记可以帮助到需要的人。
需要的基础
懂不懂原理不重要,本系列的目标是使用python实现机器学习。
必须会的东西:python基础、numpy、pandas、matplotlib和库的使用技巧。
说明
完整的代码在最后,另外之前案例中出现过的方法不会再讲解。
目录结构
模型创建
# 导入模型
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
这次使用的数据需要在网上下载,下载到本地的data文件夹内,代码文件就在data文件夹外,与之同级别(重要),网址为https://archive.ics.uci.edu/ml/machine-learning-databases/
,我们使用的数据为:
其中,后缀为data的为数据文件,names对属性进行说明的文件。
这个**数据共699条,共9个特征,一个索引id(第一列),一个肿瘤类型标签(最后一列)**具体的数据内容为:
1000025,5,1,1,1,2,1,3,1,1,2
# 索引id(没啥用),除去最后一列外的为肿瘤特征,最后一列为肿瘤的类型值
这个数据具有缺失值,缺失值使用?
表示,缺失值共16条。
这里,我们使用pandas来加载数据,首先定义一个列表,其内容为数据的标签:
# 定义标签
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加载数据并显示前五条数据:
# 导入数据
data = pd.read_csv('./data/breast-cancer-wisconsin.data',names=names)
print(data.head())
print(data.shape) # (699, 11)
结果如下:
Sample code number Clump Thickness ... Mitoses Class
0 1000025 5 ... 1 2
1 1002945 5 ... 1 2
2 1015425 3 ... 1 2
3 1016277 6 ... 1 2
4 1017023 4 ... 1 2
(699, 11)
下面,我们对缺失值进行处理,这里我们采取的简单处理,就是丢弃相关的数据即可:
# 缺失值丢失
data = data.replace(to_replace='?',value=np.NaN)
data = data.dropna()
print(data.shape) # (683, 11)
然后,我们需要把数据分开一下,即将特征提取出来,把标签页提取出来:
# 数据处理
x = data.iloc[:,1:10]
y = data.iloc[:,10]
然后,对数据集进行切分,按照8:2的比列分为训练集和测试集:
# 数据分割
x_train,x_test,y_train,y_test = model_selection.train_test_split(x,y,test_size=0.2,random_state=20)
print(x_train.shape) # (546, 9)
print(y_train.shape) #(546,)
最后,将数据进行标准化即可:
# 标准化
standard = preprocessing.StandardScaler()
x_train = standard.fit_transform(x_train)
x_test = standard.fit_transform(x_test)
首先,创建模型和训练模型:
# 创建模型
model = LogisticRegression()
model.fit(x_train,y_train)
然后,进行评估:
# 评估
y_pred = model.predict(x_test)
print('预测值:',y_pred)
score = model.score(x_test,y_test)
print('准确率:',score)
结果:
预测值: [4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 2 4 2 2 4 2 2 4 2 4 4 4 2 2 4 2 2 2 4
2 4 2 4 2 4 2 2 2 4 2 2 2 2 2 2 2 2 2 2 4 4 2 4 4 4 2 2 4 2 4 4 4 4 2 2 2
2 2 4 2 2 4 2 4 2 2 2 2 2 2 2 2 2 4 2 2 2 2 4 4 2 4 2 2 2 2 4 2 4 2 4 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 4 4 2 4 2 2 2 2 4 2 4]
准确率: 0.9562043795620438
**提醒一句:**对于这种分类来说,其实我们并不关注准确率,毕竟是医疗数据,我们更加关注的是对于肿瘤患者,我们是不是可以百分百预测出来,否则这个代码就没有太大的意义。
逻辑回归是一个常用的二分类算法,除去上面的实现方法外,还有一个常用的实现方法**就是基于梯度下降算法来实现。**不过,结果都差不多,因此这里没有演示,如果后面有需要可以补充一下相关代码。
完整代码:
# author: baiCai
# 导包
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
# 定义标签
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']
# 导入数据
data = pd.read_csv('./data/breast-cancer-wisconsin.data',names=names)
# print(data.head())
# print(data.shape) # (699, 11)
# 缺失值丢失
data = data.replace(to_replace='?',value=np.NaN)
data = data.dropna()
# print(data.shape) #(683, 11)
# 数据处理
x = data.iloc[:,1:10]
y = data.iloc[:,10]
# 数据分割
x_train,x_test,y_train,y_test = model_selection.train_test_split(x,y,test_size=0.2,random_state=20)
# print(x_train.shape) # (546, 9)
# print(y_train.shape) #(546,)
# 标准化
standard = preprocessing.StandardScaler()
x_train = standard.fit_transform(x_train)
x_test = standard.fit_transform(x_test)
# 创建模型
model = LogisticRegression()
model.fit(x_train,y_train)
# 评估
y_pred = model.predict(x_test)
print('预测值:',y_pred)
score = model.score(x_test,y_test)
print('准确率:',score)