Python之ML–模型评估与参数调优
主要知识点如下:
模型性能的无偏估计
处理机器学习算法常见问题
机器学习模型调优
使用不同的性能指标评估预测模型
一.基于流水线的工作流
本节使用scikit-learn中的Pipline类.它使得我们可以拟合出包含任意多个处理步骤的模型,并将模型用于新数据的预
1.威斯康星乳腺癌数据集
威斯康星乳腺癌(Breast Cancer Wisconsin)数据集进行讲解,此数据集共包含了569个恶性或者良性肿瘤样本.数据集的前两列分别存储了样本唯一的ID以及对样本的诊断结果(M代表恶性,B代表良性).数据集的3-32列包含了30个从细胞核照片中提取,用实数值标识的特征,它们可以用于构建判定模型,对肿瘤是良性还是恶性做出预测
使用pandas从UCI网站直接读取数据集
import pandas as pd
df=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data',header=None)
print('rows, columns:', df.shape)
df.head()
rows, columns: (569, 32)
0
1
2
3
4
5
6
7
8
9
…
22
23
24
25
26
27
28
29
30
31
0
842302
M
17.99
10.38
122.80
1001.0
0.11840
0.27760
0.3001
0.14710
…
25.38
17.33
184.60
2019.0
0.1622
0.6656
0.7119
0.2654
0.4601
0.11890
1
842517
M
20.57
17.77
132.90
1326.0
0.08474
0.07864
0.0869
0.07017
…
24.99
23.41
158.80
1956.0
0.1238
0.1866
0.2416
0.1860
0.2750
0.08902
2
84300903
M
19.69
21.25
130.00
1203.0
0.10960
0.15990
0.1974
0.12790
…
23.57
25.53
152.50
1709.0
0.1444
0.4245
0.4504
0.2430
0.3613
0.08758
3
84348301
M
11.42
20.38
77.58
386.1
0.14250
0.28390
0.2414
0.10520
…
14.91
26.50
98.87
567.7
0.2098
0.8663
0.6869
0.2575
0.6638
0.17300
4
84358402
M
20.29
14.34
135.10
1297.0
0.10030
0.13280
0.1980
0.10430
…
22.54
16.67
152.20
1575.0
0.1374
0.2050
0.4000
0.1625
0.2364
0.07678
5 rows × 32 columns
接下来,将数据集的30个特征的赋值给一个Numpy的数组对象X.使用scikit-learn中的LabelEncoder类,我们可以将类标从原始的字符串表示(M或者B)转换为整数
from sklearn.preprocessing import LabelEncoder
X=df.loc[:,2:].values
y=df.loc[:,1].values
le=LabelEncoder()
y=le.fit_transform(y)
转换后的类标(诊断结果)存储在一个数组y中,此时恶性肿瘤和良性肿瘤分别被标识为类1和类0,我们通过LabelEncoder的transform方法来显示虚拟类标(0和1)
le.transform(['M','B'])
array([1, 0], dtype=int64)
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=1)
2.在流水线中集成数据转换及评估操作
出于性能优化的目的,许多学习算法要求将不同特征的值缩放到相同的范围.我们在使用逻辑斯谛回归模型等线性分类器分析威斯康星乳腺癌数据集之前,需要对其特征列做标准化处理.我们无需在训练数据集和测试数据集上分别进行模拟拟合,数据转换,而是通过流水线将StandardScaler,PCA以及LogisticRegression对象串联起来:
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
pipe_lr=Pipeline([('s