欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【机器学习】(十五)预处理和缩放:StandardScaler、RobustScaler、MinMaxScalar、Normalizer

程序员文章站 2022-05-20 19:34:11
...

预处理:对数据的一种简单的按特征的缩放和移动。

不同类型的预处理

【机器学习】(十五)预处理和缩放:StandardScaler、RobustScaler、MinMaxScalar、Normalizer
这是一个有两个特征(x/y)的二分类数据集,四种预处理方法:

  • StandardScaler:确保每个特征的平均值为0,方差为1。
  • RobustScaler:使用中位数和四分位数(四分之一),确保每个特征的统计属性都位于同一范围。
  • MinMaxScalar:移动数据,使所有特征都刚好位于0-1之间。
  • Normalizer:对每个数据点进行缩放,使得特征向量的欧式长度等于1。

应用数据变换

MinMaxScaler缩放

from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
import mglearn

# 构造数据集,50个样本,5个类别,方差为2,测试集比例为0.1
x, _ = make_blobs(n_samples=50, centers=5, random_state=4, cluster_std=2)
x_train, x_test = train_test_split(x, random_state=5, test_size=.1)

# 绘制未处理的训练集和数据集
fig, axes = plt.subplots(1, 2, figsize=(9, 4))
axes[0].scatter(x_train[:,0], x_train[:,1], c=mglearn.cm2(0), label="Training set", s=60)
axes[0].scatter(x_test[:,0], x_test[:,1], c=mglearn.cm2(1), label="Test set", s=60)
axes[0].legend(loc='upper left')
axes[0].set_title('Original Data')

# 使用MinMaxScaler缩放数据
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train_scaled = scaler.transform(x_train)
x_test_scaled = scaler.transform(x_test)

axes[1].scatter(x_train_scaled[:,0], x_train_scaled[:,1], c=mglearn.cm2(0), label="Training set", s=60)
axes[1].scatter(x_test_scaled[:,0], x_test_scaled[:,1], c=mglearn.cm2(1), label="Test set", s=60)
axes[1].set_title('Scaled Data')

test_size参数表示切分的训练集和测试集的比例
transform方法使模型返回一种新的表示。但是缩放器(MinMaxScaler)总是对训练集和测试集应用完全相同的变换,即transform方法总是减去训练集的最小值然后除以训练集的范围。于是对测试集缩放后的数据可能不是0-1。
【机器学习】(十五)预处理和缩放:StandardScaler、RobustScaler、MinMaxScalar、Normalizer

在cancer数据集使用MinMaxScaler处理的SVC分类器

from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()
x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)

svm = SVC(C=100)
svm.fit(x_train, y_train)
print(svm.score(x_test, y_test)) # 0.9440559440559441

# 使用0-1缩放进行预处理
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train_scaled = scaler.transform(x_train)
x_test_scaled = scaler.transform(x_test)

svm.fit(x_train_scaled, y_train)
print(svm.score(x_test_scaled, y_test)) # 0.965034965034965