1.特征工程预处理
即进行归一化/标准化
为什么要进行归一化/标准化?
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
但是,一般使用标准化,归一化只适合传统精确小数据场景。
标准化
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
**API**
**sklearn.preprocessing.StandardScaler( )**
处理之后每列来说所有数据都聚集在均值0附近标准差差为1
StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
适合现代嘈杂大数据场景。
2.交叉验证、网格搜索
交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。
交叉验证的目的:为了让被评估的模型更加准确可信
网格搜索:通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
API:sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
对估计器的指定参数值进行详尽搜索
estimator:估计器对象
param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
cv:指定几折交叉验证
fit:输入训练数据
score:准确率
结果分析:
bestscore__:在交叉验证中验证的最好结果
bestestimator:最好的参数模型
cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果
3.sklearn实现KNN
会用到交叉验证和网格搜索
此处因为是写一步,看一步,用的是jupyter notebook,故没有一起导包
1.获取数据集
2.数据基本处理
3.特征工程
4.机器学习(模型训练)
5.模型评估
#1.获取数据集
#这里的数据为原本手写数字识别的测试集(9999,785)
import pandas as pd
import numpy as np
data = pd.read_csv("Mnist/mnist_test.csv")
#读进来的数据第一列是标签,那就要对他进行划分
#读进来是一个DataFrame形式的数据结构
#2.数据基本处理
#把数据划分成两部分,手写数字识别的数据分布,是上述的data
#把标签和数据分开
#label为标签,data为数据
#转换为矩阵形式
data = np.array(data)
label = data[:,0]
data = data[:,1:]
#3.特征工程
#此处特征工程的处理为,划分7.5比2.5的训练集和测试集
#做标准化的处理
#训练集的测试集划分的库
from sklearn.model_selection import train_test_split
#标准化处理的库
from sklearn.preprocessing import StandardScaler
#做出对数据集的划分
x_train,x_test,y_train,y_test = train_test_split(data,label,test_size=0.25)
#进行标准化处理
#实例化一个学习器
transfer = StandardScaler()
#以训练集x_train为训练标准,并以这个标准去把x_test也做同样的转化
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#4.机器学习(模型训练)
#KNN的模型训练包
from sklearn.neighbors import KNeighborsClassifier
#实例化一个学习器
#n_neighbors为设定的邻居数
#也就是说最后要从这9个中进行投票表决
estimator = KNeighborsClassifier(n_neighbors=15)
#对训练集进行训练
estimator.fit(x_train,y_train)
#5.模型评估
#对比一下真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:",y_predict)
print("比对真实值和预测值:",y_predict == y_test)
#直接计算准确率
score = estimator.score(x_test,y_test)
print("准确率为:",score)
结果
预测结果为: [6 6 3 ... 4 4 6]
比对真实值和预测值: [ True False True ... True True True]
准确率为: 0.9416
#交叉验证、网格搜索,部分步骤改变一下即可
from sklearn.model_selection import GridSearchCV
#KNN的模型训练包
from sklearn.neighbors import KNeighborsClassifier
#实例化一个学习器
#n_neighbors为设定的邻居数
#也就是说最后要从这9个中进行投票表决
#估计器里不需要填写参数n_neighbors
estimator = KNeighborsClassifier()
# 4.2 模型选择与调优——网格搜索和交叉验证
#准备要调的超参数
param_dict = {"n_neighbors":[5,9,15]}
estimator = GridSearchCV(estimator,param_grid=param_dict,cv=3)
#对训练集进行训练
estimator.fit(x_train,y_train)
#5.模型评估
#对比一下真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:",y_predict)
print("比对真实值和预测值:",y_predict == y_test)
#直接计算准确率
score = estimator.score(x_test,y_test)
print("准确率为:",score)
结果
预测结果为: [6 6 3 ... 4 4 6]
比对真实值和预测值: [ True False True ... True True True]
准确率为: 0.9544
#查看最好的结果
estimator.best_estimator_
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=5, p=2,
weights='uniform')