手记

【学习打卡】第10天 Python3入门机器学习

课程介绍


课程名称: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算法优点很明显,缺点也很致命,在特征量少,分类算法中,这仍然是个不错的选择。继续学习继续强大

课程截图

1人推荐
随时随地看视频
慕课网APP