课程介绍
课程名称:Python3入门机器学习 经典算法与应用 入行人工智能
课程章节:4-7;4-8;4-9
主讲老师:liuyubobobo
内容导读
- 第一部分 归一化
- 第二部分 scikit-learn中的Scaler
课程详细
第一部分 归一化
假如两个维度的数据相差太大,计算起来的量就很大且偏差大,因为数据相差大的权重就大,小的权重就小,但其实二着其实相同
解决方案,将所有数据映射到同一尺度均值归一
-
数据归一化 把所有数据映射到0-1之间 (数据-最小的数据)/(最大的数据-最小的数据) (适用于分布有明显边界的情况,受outtlier影响较大
-
均值方差归一化 把所有数据归一到均值为0方差为1的分布中 数据分布没有明显边界,可能存在极端数据 (数据-均值)/方差
数据归一化
适用于分布有明显边界的情况
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randint(0,100,size=100)
(x-np.min(x)) / (np.max(x) - np.min(x))
#矩阵也可以
X = np.random.randint(0,100,size=(50,2))
X = np.array(X, dtype = 'float')
(x-np.min(x)) / (np.max(x) - np.min(x))
#假如特征多的话就可以使用for循环
X[:,0]=(X[:,0] - np.min(X[:,0])) / (np.max(X[:,0]) - np.min(X[:,0]))
X[:,1]=(X[:,1] - np.min(X[:,1])) / (np.max(X[:,1]) - np.min(X[:,1]))
均值方差归一化
适用没有明显边界,可能存在极端数据
#均值
np.mean(X[:,0])
#方差
np.std(X[:,0])
X2 = np.random.randint(0,100,size=(50,2))
X2 = np.array(X2, dtype=float)
X2[:,0] = (X2[:,0]-np.mean(X2[:,0])) / np.std(X2[:,0])
X2[:,1] = (X2[:,1]-np.mean(X2[:,1])) / np.std(X2[:,1])
第二部分 scikit-learn中的Scaler
问题一、为什么要进行数据的均值归一? 因为,有些数据差距太大如特征一1-5特征二100-500.就会使特征一的权重下降,使特征一几乎不参与机器学习,导致准确率降低,所以需要均值归一使数据都在0-1左右
问题二、归一化的种类? 1.数据归一化 (数据-最小的数据)/(最大的数据-最小的数据) 适用于,数据有明显边界,没有异常数据点的数据集 2.均值归一化 (数据-均值)/方差 数据分布没有明显边界,可能存在极端数据
问题三、如何对测试数据集进行归一化? 先将训练数值进行归一化,再将过程关键数据传给测试数据进行同样的归一化,举个例子均值归一化: 训练数据集-X_train 测试数据集X_test 训练数据集的均值 mean_train = np.mean(X_train) 训练数据集的方差 std_train = np.std(X_train) 训练数据集归一化过程:(X_train-mean_train) / std_train 测试数据集归一化过程:(X_test-mean_train) / std_train 总结来说测试数据集使用的均值和方差,为训练数据集的均值和方差,所以需要保留关键参数,为此scikit-learn专门开发了Scaler函数进行归一化操作
#导入函数和鸢尾花数据
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y= iris.target
#切割数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.2, random_state=666)
#重点来咯
from sklearn.preprocessing import StandardScaler
#其实这个进行归一化的和KNN算法很相似。
#第一步创建对象 StandardScaler()
standardScalar = StandardScaler()
#第二步 fit(X_train)对训练集进行创建模型,并保留关键参数
standardScalar.fit(X_train)
#第三步 transform(X_train)传入参数进行归一化
X_train = standardScalar.transform(X_train)
#说明,transform可以传入X_train和X_test,进行同样的归一化
X_test_standard = standardScalar.transform(X_test)
from sklearn.neighbors import KNeighborsClassifier
knn_clf.fit(X_train, y_train)
knn_clf.score(X_test_standard, y_test)
#1.0 在这种情况下运行可以达到很高的准确率
课程思考
sklearn这个库真是越学习越强大,经过浙一单元的学习,编写了某几个函数的底层代码,也保留了一些悬念,总的来说KNN算法优点很明显,缺点也很致命,在特征量少,分类算法中,这仍然是个不错的选择。继续学习继续强大