svm二分类代码Python预处理(svm分类器训练详细步骤)

图片[1]-svm二分类代码Python预处理(svm分类器训练详细步骤)-搜搜号

数据预处理与缩放

一些算法(如神经网络和SVM)对数据缩放非常敏感。因此,通常的做法是对特征进行调节,使数据表示更适合于这些算法。通常来说,这是对数据的一种简单的按特征的缩放和移动。下面的代码(图3-1)给出了一个简单的例子:

mglearn.plots.plot_scaling()

plt.suptitle(“图3-1:对数据集缩放和预处理的各种方法”,y = 0.1 ,fontsize = 18);

图片[2]-svm二分类代码Python预处理(svm分类器训练详细步骤)-搜搜号

不同类型的预处理

MinMaxScaler移动数据,使所有特征都刚好位于0到1之间。

StandardScaler确保每个特征的平均值得为0,方差为1,使所有特征都位于同一量级。

RobustScaler的工作原理与StandardScaler类似,使用的是中位数和四分位数,确保每个特征的统计属性都位于同一范围。它会忽略与其他点有很大不同的数据点,即忽略异常值outlier。

Normalizer对第个数据点进行缩放,使得特征向量的欧式长度等于1。换句话说,它将一个数据点投射到半径为1的圆上。

应用数据变换

下面利用scikit-learn 来应用这些变换。我们将使用cancer 数据集。通常在应用监督学习算法之前使用预处理方法(比如缩放)。举个例子,比如我们想要将核SVM(SVC)应用在cancer 数据集上,并使用MinMaxScaler 来预处理数据。首先加载数据集并将其分为训练集和测试集(我们需要分开的训练集和数据集来对预处理后构建的监督模型进行评估):

from sklearn.datasets import load_breast_cancer

from sklearn.model_selection import train_test_split

3 cancer = load_breast_cancer()

4 x_train,x_test,y_train,y_test = train_test_split(cancer.data,cancer.target,random_state=1)

5 print(x_train.shape)

6 print(x_test.shape)

(426, 30)

(143, 30)

这个数据集包含569 个数据点,每个数据点由30 个测量值表示。我们将数据集分成包含426 个样本的训练集与包含143 个样本的测试集。与之前构建的监督模型一样,我们首先导入实现预处理的类,然后将其实例化:

from sklearn.preprocessing import MinMaxScaler

2 scaler = MinMaxScaler()

3 scaler.fit(x_train)

Out[ ]: MinMaxScaler(copy=True, feature_range=(0, 1))

然后,使用fit 方法拟合缩放器(scaler),并将其应用于训练数据。对于MinMaxScaler 来说,fit 方法计算训练集中每个特征的最大值和最小值。在对缩放器调用fit 时只提供了x_train,而不用y_train。

为了应用刚刚学习的变换(即对训练数据进行实际缩放),我们使用缩放器的transform方法。在scikit-learn 中,每当模型返回数据的一种新表示时,都可以使用transform方法:

1 # 变换数据

2 x_train_scaled = scaler.transform(x_train)

3 # 在缩放之前和之后分别打印数据集属性

4 print(“transformed shape:{}”.format(x_train_scaled.shape))

5 print(“pre-feature minimum before scaling:\n{}”.format(x_train.min(axis=0)))

6 print(“pre-feature maximum before scaling:\n{}”.format(x_train.max(axis=0)))

7 print(“pre-feature minimum after scaling:\n{}”.format(x_train_scaled.min(axis=0)))

8 print(“pre-feature maximum after scaling:\n{}”.format(x_train_scaled.max(axis=0)))

transformed shape:(426, 30)

pre-feature minimum before scaling:

[ 6.981 9.71 43.79 143.5 0.053 0.019 0. 0. … 0.027 0. 0. 0.157 0.055]

pre-feature maximum before scaling:

[ 28.11 39.28 188.5 2501. 0.163 0.287 0.427 0.201 …. 0.938 1.17 0.291 0.577 0.149]

pre-feature minimum after scaling: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

pre-feature maximum after scaling: [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

变换后的数据形状与原始数据相同,特征只是发生了移动和缩放。你可以看到,现在所有特征都位于0 到1 之间,这也符合我们的预期。为了将SVM 应用到缩放后的数据上,还需要对测试集进行变换。这可以通过对x_test 调用transform 方法来完成:

1 # 对测试数据进行变换

2 x_test_scaled = scaler.transform(x_test)

3 # 在缩放之后打印测试数据的属性

4 print(“pre-feature minimum after scaling:\n{}”.format(x_test_scaled.min(axis=0)))

5 print(“pre-feature maximum after scaling:\n{}”.format(x_test_scaled.max(axis=0)))

pre-feature minimum after scaling:

[ 0.034 0.023 0.031 0.011 0.141 0.044 0. 0. 0.154 -0.006 … 0.109 0.026 0. 0. -0. -0.002]

pre-feature maximum after scaling:

[0.958 0.815 0.956 0.894 0.811 1.22 0.88 0.933 0.932 1.037 … 0.915 1.132 1.07 0.924 1.205 1.631]

对测试集缩放后的数据有的超出的0~1的范围。这是因为MinMaxScaler总是对训练集和测试集应用完全相同的变换,transform方法总是用特征值减去训练集的最小集,然后除以训练集的范围。测试集缩放时也用训练集的最小值和范围。

你可以发现,对测试集缩放后的最大值和最小值不是1 和0,有些特征甚至在0~1 的范围之外!MinMaxScaler(以及其他所有缩放器)总是对训练集和测试集应用完全相同的变换。也就是说,transform 方法总是减去训练集的最小值,然后除以训练集的范围。

对训练数据和测试数据进行相同的缩放

为了让监督模型能够在测试集上运行,对训练集和测试集应用完全相同的变换是很重要的。如果我们使用测试集的最小值和范围,下面这个例子(图3-2最右图)展示了会发生什么:

from sklearn.datasets import make_blobs

2 x,_ = make_blobs(n_samples=50,centers=5,random_state=4,cluster_std =2 )

3 x_train,x_test = train_test_split(x,random_state=5,test_size=0.1)

4 fig,axes = plt.subplots(1,3,figsize=(18,4))

5 axes[0].scatter(x_train[:,0],x_train[:,1],c= mglearn.cm2(0),label=“Training set”,s=60)

6 axes[0].scatter(x_test[:,0],x_test[:,1],marker=‘^’,c = mglearn.cm2(1),label=“Test set”,s=60)

7 axes[0].legend(loc=‘best’)

8 axes[0].set_title(“Original Data”)

9

10 scaler.fit(x_train)

11 x_train_scaled = scaler.transform(x_train)

12 x_test_scaled = scaler.transform(x_test)

13 axes[1].scatter(x_train_scaled[:,0],x_train_scaled[:,1],c= mglearn.cm2(0),label=“Training set”,s=60)

14 axes[1].scatter(x_test_scaled[:,0],x_test_scaled[:,1],marker=‘^’,c = mglearn.cm2(1),label=“Test set”,s=60)

15 axes[1].legend(loc=‘best’)

16 axes[1].set_title(“Scaled Data”)

17​

18 test_scaler = MinMaxScaler()

19 test_scaler.fit(x_test)

20 x_test_scaled_badly = test_scaler.transform(x_test)

21 axes[2].scatter(x_train_scaled[:,0],x_train_scaled[:,1],c= mglearn.cm2(0),label=“Training set”,s=60)

22 axes[2].scatter(x_test_scaled_badly[:,0],x_test_scaled_badly[:,1],marker=‘^’,c = mglearn.cm2(1),label=“Test set”,s=60)

23 axes[2].legend(loc=‘best’)

24 axes[2].set_title(“Improperly Scaled Data”)

25​

26 for ax in axes:

27 ax.set_xlabel(“Feature 0”)

28 ax.set_ylabel(“Feature 1”)

图片[3]-svm二分类代码Python预处理(svm分类器训练详细步骤)-搜搜号

第一张图是未缩放的二维数据集,其中训练集用圆形表示,测试集用三角形表示。第二张图中是同样的数据,但使用MinMaxScaler 缩放。这里我们调用fit 作用在训练集上,然后调用transform 作用在训练集和测试集上。你可以发现,第二张图中的数据集看起来与第一张图中的完全相同,只是坐标轴刻度发生了变化。现在所有特征都位于0 到1 之间。你还可以发现,测试数据(三角形)的特征最大值和最小值并不是1 和0。

第三张图展示了如果我们对训练集和测试集分别进行缩放会发生什么。在这种情况下,对训练集和测试集而言,特征的最大值和最小值都是1 和0。但现在数据集看起来不一样。测试集相对训练集的移动不一致,因为它们分别做了不同的缩放。我们随意改变了数据的排列。这显然不是我们想要做的事情。再换一种思考方式,想象你的测试集只有一个点。对于一个点而言,第三个图无法将其正确地缩放以满足MinMaxScaler 的最大值和最小值的要求。但是,测试集的大小不应该对你的处理方式有影响。结论是采用第二图,训练集和测试集采用相同的缩放。

预处理对监督学习的作用

现在我们回到cancer 数据集,观察使用MinMaxScaler 对学习SVC 的作用。首先,为了对比,我们再次在原始数据上拟合SVC:

from sklearn.svm import SVC

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

3 svm = SVC(C=100)

4 svm.fit(x_train,y_train)

5 print(“Train set accuracy: {:.2f}”.format(svm.score(x_train,y_train)))

6 print(“Test set accuracy: {:.2f}”.format(svm.score(x_test,y_test)))

Train set accuracy: 1.00

Test set accuracy: 0.63

1 #下面先用MinMaxScaler 对数据进行缩放,然后再拟合SVC:

2 # 使用0-1缩放进行预处理

3 scaler = MinMaxScaler()

4 scaler.fit(x_train)

5 x_train_scaled = scaler.transform(x_train)

6 x_test_scaled = scaler.transform(x_test)

7 # 在缩放后的训练数据上学习SVM

8 svm.fit(x_train_scaled,y_train)

9 # 在缩放后的测试集上计算分数

10 print(“Scaled Test set accuracy: {:.3f}”.format(svm.score(x_test_scaled,y_test)))

Scaled Test set accuracy: 0.965

正如我们上面所见,数据缩放的作用非常显著。虽然数据缩放不涉及任何复杂的数学,但良好的做法仍然是使用scikit-learn 提供的缩放机制。

除了MinMaxScaler(),其他的预处理类都具有相同的接口,都包含fit 和transform 方法:

1 # 利用零均值和单位方差的缩放方法进行预处理

from sklearn.preprocessing import StandardScaler

3 scaler = StandardScaler()

4 scaler.fit(x_train)

5 x_train_scaled = scaler.transform(x_train)

6 x_test_scaled = scaler.transform(x_test)

7 svm.fit(x_train_scaled,y_train)

8 print(“SVM Test accuracy: {:.3f}”.format(svm.score(x_test_scaled,y_test)))

SVM Test accuracy: 0.958

1 # 利用中位数和四分位数的缩放方法进行预处理

from sklearn.preprocessing import RobustScaler

3 scaler = RobustScaler()

4 scaler.fit(x_train)

5 x_train_scaled = scaler.transform(x_train)

6 x_test_scaled = scaler.transform(x_test)

7 svm.fit(x_train_scaled,y_train)

8 print(“SVM Test accuracy: {:.3f}”.format(svm.score(x_test_scaled,y_test)))

SVM Test accuracy: 0.951​

【本文结束】

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容