数据缩放是通过数学变换将原始数据按照一定的比例进行转换,将数据放到一个统一的区间内。目的是消除样本特征之间数量级的差异,转化为一个无量纲的相对数值,使得各个样本特征数值都处于同一数量级上,从而提升模型的准确性和效率。
本任务中,我们通过两个案例来掌握数据缩放算法的使用,并观察数据缩放对于机器学习模型的影响。
源码下载
操作系统:Windows 10、Ubuntu18.04
工具软件:Anaconda3 2019、Python3.7
硬件环境:无特殊要求
依赖库列表
scikit-learn 0.24.2
任务1-《通过数据缩放提高肿瘤预测模型的准确率》涉及以下环节:
a)加载、拆分肿瘤数据集
b)进行数据缩放
c)使用支持向量机(SVM)算法对比缩放前后的预测准确率
任务2-《通过数据缩放提高红酒分类模型的准确率》涉及以下环节:
a)加载、拆分红酒数据集
b)进行数据缩放
c)分别使用KNN、SVM和逻辑回归算法对比缩放前后的分类准确率
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
cancer = load_breast_cancer() # 加载肿瘤数据集
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
# 数据缩放
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.fit_transform(X_test)
# SVC分类评估(缩放前)
model = SVC().fit(X_train, y_train)
print('数据缩放前,模型准确率:{:.2f}'.format(model.score(X_test, y_test)))
# SVC分类评估(缩放后)
model = SVC().fit(X_train_scaled, y_train)
print('数据缩放后,模型准确率:{:.2f}'.format(model.score(X_test_scaled, y_test)))
# 查看缩放前后的数据示例
print('缩放前数据示例:', X_train[:,0][:5])
print('缩放后数据示例:', X_train_scaled[:,0][:5])
输出结果:
数据缩放前,模型准确率:0.94
数据缩放后,模型准确率:0.91
缩放前数据示例: [11.85 11.22 20.13 13.59 16.69]
缩放后数据示例: [0.23044157 0.20062473 0.62232003 0.31279284 0.45951063]
可以看到,使用SVC分类器在参数相同的情况,缩放后的数据模型准确性有较大提升。
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler, MaxAbsScaler
# 加载红酒数据集
wine = load_wine()
data = wine.data # 样本数据
target = wine.target # 数据标签
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(data, target, random_state=0)
# 对训练数据和测试数据进行缩放
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.fit_transform(X_test)
# KNN模型,缩放前后准确率对比
knn = KNeighborsClassifier(n_neighbors=3)
score_1 = knn.fit(X_train, y_train).score(X_test, y_test)
score_2 = knn.fit(X_train_scaled, y_train).score(X_test_scaled, y_test)
print('KNN 分类,数据缩放前后准确率:{:0.2f} vs {:0.2f}'.format(score_1, score_2))
# SVC模型,缩放前后准确率对比
svc = SVC(gamma='scale')
score_1 = svc.fit(X_train, y_train).score(X_test, y_test)
score_2 = svc.fit(X_train_scaled, y_train).score(X_test_scaled, y_test)
print('SVM 分类,数据缩放前后准确率:{:0.2f} vs {:0.2f}'.format(score_1, score_2))
# 逻辑回归模型,缩放前后成绩对比
lr = LogisticRegression()
score_1 = lr.fit(X_train, y_train).score(X_test, y_test)
score_2 = lr.fit(X_train_scaled, y_train).score(X_test_scaled, y_test)
print('逻辑回归,数据缩放前后准确率:{:0.2f} vs {:0.2f}'.format(score_1, score_2))
结果如下:
KNN 分类,数据缩放前后准确率:0.73 vs 1.00
SVM 分类,数据缩放前后准确率:0.82 vs 0.93
逻辑回归,数据缩放前后准确率:0.93 vs 0.96
可以看到,三种分类模型在缩放后的数据集上分类的准确性都得到提升。