【机器学习】(十五)预处理和缩放:StandardScaler、RobustScaler、MinMaxScalar、Normalizer
程序员文章站
2022-05-20 19:34:11
...
预处理:对数据的一种简单的按特征的缩放和移动。
不同类型的预处理
这是一个有两个特征(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。
在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