数据缩放在监督学习中的应用

数据缩放在监督学习中的应用

描述

数据缩放是通过数学变换将原始数据按照一定的比例进行转换,将数据放到一个统一的区间内。目的是消除样本特征之间数量级的差异,转化为一个无量纲的相对数值,使得各个样本特征数值都处于同一数量级上,从而提升模型的准确性和效率。

本任务中,我们通过两个案例来掌握数据缩放算法的使用,并观察数据缩放对于机器学习模型的影响。

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    scikit-learn	0.24.2
    

分析

任务1-《通过数据缩放提高肿瘤预测模型的准确率》涉及以下环节:

a)加载、拆分肿瘤数据集

b)进行数据缩放

c)使用支持向量机(SVM)算法对比缩放前后的预测准确率

任务2-《通过数据缩放提高红酒分类模型的准确率》涉及以下环节:

a)加载、拆分红酒数据集

b)进行数据缩放

c)分别使用KNN、SVM和逻辑回归算法对比缩放前后的分类准确率

实施

1、通过数据缩放提高肿瘤预测模型的准确率

1.1 加载并缩放数据

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)

1.2 在缩放前后的数据集上创建SVM模型,对比预测准确性

# 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分类器在参数相同的情况,缩放后的数据模型准确性有较大提升。

2、通过数据缩放提高红酒分类模型的准确率

2.1 加载红酒数据集,对数据进行缩放

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)

2.2 对比KNN、SVM和逻辑回归算法在缩放前后的数据集上的分类准确性

# 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

可以看到,三种分类模型在缩放后的数据集上分类的准确性都得到提升。

你可能感兴趣的:(机器学习,学习,机器学习,支持向量机)