速度问题
不同的算法之间,必然有不同的应用场景,比如knn的训练时间特别短,但是使用的时候消耗的时间就比较长,因为训练的时候他只是记录了各个点的位置,并没有做别的事
而lgc(逻辑回归)训练的时间比较长,要计算各种权重,通过梯度下降找到最优解,但是使用的过程中就比较快,因为模型已经训练完毕了,后续只需要代入样本的数据就可以拿到结果
所以选择什么算法,和我们的速度有很大的关系!
模型总结
1.思维导图
2.完整流程演示
导包
import numpy as np import pandas as pd import matplotlib.pyplot as plt
df = pd.read_table('./data/wheats.tsv',header=None) # 读取需要我们处理的文件数据
回顾之前的做法
# 特征值 目标值 target = df.iloc[:,7] data = df.iloc[:,:-1]
数据需要预处理的情况
先以0.25的默认比例分割数据集 选择合适的数据处理方式
from sklearn.model_selection import train_test_split # 使用sklearn模块提供的切分方法来做训练集和测试集的切分 X_train,X_test,y_train,y_test = train_test_split(data,target) from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier() knn.fit(X_train,y_train).score(X_test,y_test) # 0.83
sklearn官网可以查看各个方法之间的区别,这里简单的叙述一下:
MinMaxScaler 区间归一化 (当前值-最小值)/(最大值-最小值) 把数值的范围缩放到0-1之间
StandardScaler 标准化 (当前值-平均值)/标准差 均值变成了0 标准差变成了1 把数据集变成标准正态分布
Normalizer 归一化 (当前值-平均值)/(最大值-最小值) 对区间进行缩放 -1 1
Binarizer 二值化 (这里就不尝试了 主要用来处理图片)二值化 其实就是把很多值变成两个值
from sklearn.preprocessing import MinMaxScaler,StandardScaler,Normalizer mms = MinMaxScaler() data.shape mms.fit(data) # mms.fit_transform 如果训练和转换用的是同样的数据集 可以使用fit_transform mms_data = mms.transform(data) # 使用处理后的数据去训练模型 # 对处理后的数据集进行切分 分成 训练集 和测试集 X_train1,X_test1,y_train1,y_test1 = train_test_split(mms_data,target) knn.fit(X_train1,y_train1).score(X_test1,y_test1) # 数据量比较小 打分可能有偶然因素 #0.88
可以看出做了区间归一化的数据对我们的结果预测的准确率有一定的提高
封装一个方法,专门用来测试数据更适合哪个归一化的模型(数据预处理模型)
def cross_verify(model,data,target): scores = [] # 按照不同比例去切分 训练集 和 测试集 for i in np.arange(5,35,1): X_train,X_test,y_train,y_test = train_test_split(data,target,test_size=i/100) score = model.fit(X_train,y_train).score(X_test,y_test) scores.append(score) return np.array(scores).mean()
多次打分求平均分
使用不同的数据预处理方式 对数据进行处理
看看不同模型的差异
然后封装一个测试 最合适的分类模型的函数
# 传入指定的模型 和 没有处理之前的 数据的特征值和目标值(在函数中 我们会进行各种预处理) def prepro(model,data,target): # 先做区间缩放MinMaxScaler mms_data = MinMaxScaler().fit_transform(data) # 打印输出平均分 print('使用MinMaxScaler预处理得分是:',cross_verify(model,mms_data,target)) # StandardScaler ss_data = StandardScaler().fit_transform(data) print('使用StandardScaler预处理得分是:',cross_verify(model,ss_data,target)) # Normalizer n_data = Normalizer().fit_transform(data) print('使用Normalizer预处理得分是:',cross_verify(model,n_data,target)) # 注意:没有做过数据预处理的 数据集 也打下分 print('没有做数据预处理得分是:',cross_verify(model,data,target))
from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier() from sklearn.linear_model import LogisticRegression lgc = LogisticRegression() from sklearn.tree import DecisionTreeClassifier dtree = DecisionTreeClassifier() from sklearn.naive_bayes import GaussianNB gnb = GaussianNB() from sklearn.svm import SVC svc = SVC()
prepro(knn,data,target)
prepro(lgc,data,target)
....
数据不进行预处理的情况
假设 数据 不需要预处理 先做要考虑的是选择哪种模型,那么应该怎么做呢
除了平均分 比较 重要 得分的差异情况也需要参考一下(算法的稳定性)
def cross_verify2(model,data,target): scores = [] for i in np.arange(5,35,1): X_train,X_test,y_train,y_test = train_test_split(data,target,test_size=i/100) score = model.fit(X_train,y_train).score(X_test,y_test) scores.append(score) # 除了要计算平均值 还要计算标准差 就不返回了 打印输出 # return np.array(scores).mean() print('使用{}模型,平均分{},标准差是{}'.format(model.__class__.__name__,np.array(scores).mean(),np.array(scores).std()))
# 以列表的形式 传入多个备选模型 以及数据 def select_model(models,data,target): for model in models: cross_verify(model,data,target)
选择完模型之后 还需要 看看 不同的参数 对分类的准确率 能否提高
这里就拿SVC来做例子
# C=1.0 # C指的是 对 误差样本的容忍程度 # C越大表示 容忍度越低 容易过拟合 # C越小表示 容忍度越高 容易欠拟合 svc = SVC() # svc.set_params 创建好模型之后 还可以重新对模型的参数进行设置 for i in [0.01,0.1,1.0,10,100,1000,10000]: # svc = SVC(C=i) svc.set_params(C=i) cross_verify(svc,data,target)