一、学习算法:监督与非监督
监督学习:通过提前训练好一批数据集,成为一个模型,每当有新数据通过模型后输出准确预测。为什么叫有监督的学习?因为训练数据集中有label,可以在训练的过程纠正你的训练
非监督学习:不需要提前训练数据集,直接将数据集输入,且从数据集中提取知识。
二、为什么要使用非监督学习预处理数据?
在监督学习算法中,有很多用于分类和回归的算法对数据集中每个数据点的高维度比较敏感,敏感就是说如果不降维,得到的预测结果往往是不好的。所以要采用无监督变换方法,该方法输入时接收具有许多特征的高维数据,找到一种可以表示该数据新的方法,可以用较少的特征就能概括其重要特性,俗称降维。
通过非监督变换将高维数据变成可以概括重要特征的低维数据,再应用于监督学习算法,这样可以提高算法精度和减少运行时间,这在监督学习中是一种比较常用的方法。
三、实现过程
首先要指导4个预处理数据类,不同类的处理结果对最终预测结果有所不同。
StandardScaler(设置数据点的每个特征的平均值为0,方差为1,使得所有特征都位于同一量级)
RobustScaler(设置中位数和四位数,也可以使得所有特征都位于同一量级,处理效果不好不常用)
MinMaxScaler(移动数据点(0-1)*(0-1)矩形之间)
Normaizer(对每个数据点进行缩放,使得特征向量的欧式长度等于1,即将数据点映射到半径为1的圆或球面)
下面以癌症数据集测试为例:
from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler,Normalizer
def scale_unsuper(self):
"""
监督学习算法前采用无监督学习进行数据缩放,使得精度更高
1. 使用svm对癌症数据进行分类
2. 数据预处理,进行缩放,有四大类,只对训练集进行处理
3. 采用fit(),tranform()转换,处理数据降到低维
4. 使用svm模型训练预测结果
"""
cancer = load_breast_cancer()
x_train,x_test,y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
# 训练集数据(426,30),测试集数据(143,30),训练集标签(0/1),测试集标签(0/1)
svm = SVC(C=100)
# 未使用 非监督变换处理数据测试结果
svm.fit(x_train,y_train)
print(' Test accracy:{:.2f}'.format(svm.score(x_test,y_test)))
#使用非监督变换MinMaxScaler类处理数据测试结果
scale = MinMaxScaler()
scale.fit(x_train) # 只处理训练集,不用处理测试集
x_train_minmaxscaled = scale.transform(x_train)
x_test_minmaxscaled = scale.transform(x_test)
svm.fit(x_train_minmaxscaled, y_train)
print('MinMaxScaled test accracy:{:.2f}'.format(svm.score(x_test_minmaxscaled, y_test)))
#使用非监督变换MinMaxScaler类处理数据测试结果
scaler=Normalizer()
scaler.fit(x_train)
x_train_normalscaled = scaler.transform(x_train)
x_test_normalscaled = scaler.transform(x_test)
svm.fit(x_train_normalscaled, y_train)
print('NormalScaled test accracy:{:.2f}'.format(svm.score(x_test_normalscaled, y_test)))
输出结果:
可以看到,采用非监督变换可以提高测试精度,且不同类的测试精度不同,这里要注意一点就是预处理类只对训练集进行训练,对测试集不用,但可以对测试集进行转换
附:这里讲一下关于多个方法之间采用方法链和快捷方式的使用
scale.fit(x_train)
x_train_minmaxscaled = scale.transform(x_train)
方法链:一个对象在同一行代码中添加多个方法函数:
eg.x_train_minmaxscaled =scale.fit(x_train).transform(x_train)
快捷方式:在传入参数一样的情况下,将两个方法合并成一个方法
eg.x_train_minmaxscaled=scale.fit_transform(x_train)