分析小麦数据时的模型选择
一、模型总结
1)分类问题
1、knn
缺点:
时间复杂度 空间复杂度高
优点:
实现简单,易于理解
总结:适合样本最小,分类边界不明显的情况
2、逻辑回归
优点:
分类时计算量非常小,速度很快,存储资源低
缺点:
容易欠拟合,准确度不高
总结:适合样本量大的情况
3、决策树
优点:
对于有明确业务逻辑的数据分类效果好,分类效果可解释性强,容易提取出规则
缺点:
容易过拟合和欠拟合
总结:适合有业务逻辑的数据
4、贝叶斯
总结:主要用于自然语言处理
5、svm(支持向量机)
优点:
样本量最小的情况下,效果好,不容易过拟合
缺点:
当观测样本很多时,效率并不是很高
总结:
适合样本最小,分类边界比较明显的情况
2)回归问题
1、线性回归
缺点:
和svm相比容易欠拟合
优点:
实现简单,计算简单
总结:
回归时,样本量大 用线性回归
2、岭回归
总结:用于图片之类的特征维度很多的回归预测
3、lasso回归
总结:用于需要去除部分不重要特征的回归预测
4、svm(支持向量机)
总结:回归时,样本量小 用svm
3)聚类
1、kmeas
优点:
当簇是密集的、球状或者团状的,且蔟与簇中间区别明显的时候,聚类效果较好
缺点:
最大的问题就是K的选取
总结:
不知道该分几类的时候,可以用聚类来看效果
二、业务流程
1)数据获取
一般业务会给数据 / 爬虫自己爬取
2)数据预处理
特征选择、归一化、二值化、数值映射、2vector、PCA LDA、清洗和过滤
3)算法选择
检验、测试、交叉验证、svm、logistic、decition Tree
4)算法调优
网格搜索(对参数进行筛选)
5)算法评价
精确率 - 查准率
召回率 - 查全率
6)分析报告
三、获取数据
1)获取数据
1、导包导入数据
import numpy as np
import pandas as pd
df = pd.read_table('./data/wheats.tsv',header=None)
df
2、处理数据
data = df.iloc[:,:-1]
target = df.iloc[:,-1]
2)
3)
4)
5)
6)
四、数据预处理
1)导包
# sklearn官网
# MinMaxScaler 区间归一化 (当前值-最小值)/(最大值-最小值)
# StandardScaler 标准化 (当前值-平均值)/标准差
# Normalizer 归一化 (当前值-平均值)/(最大值-最小值)
# Binarizer 二值化 (这里就不尝试了 主要用来处理图片)
from sklearn.preprocessing import MinMaxScaler,Normalizer,StandardScaler,Binarizer
2)创建模型-训练模型-用模型转化数据
minmax_data = MinMaxScaler().fit_transform(data)
normal_data = Normalizer().fit_transform(data)
standard_data = StandardScaler().fit_transform(data)
3)拆分训练集和测试集
先按照 0.25的 比例 对 各种预处理方式 转换后的数据 进行学习
(各种机器学习模型都尝试一下) 看看效果
X_train1, X_test1, y_train1, y_test1 = train_test_split(data,target,test_size=0.25) # 没有处理的数据
X_train2, X_test2, y_train2, y_test2 = train_test_split(minmax_data,target,test_size=0.25)
X_train3, X_test3, y_train3, y_test3 = train_test_split(normal_data,target,test_size=0.25)
X_train4, X_test4, y_train4, y_test4 = train_test_split(standard_data,target,test_size=0.25)
4)使用一些分类模型去处理
使用一些分类模型去尝试 knn lgc dtree nb svc
1、导包
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
2、获取模型
knn = KNeighborsClassifier()
lgc = LogisticRegression()
dtree = DecisionTreeClassifier()
gnb = GaussianNB()
svc = SVC()
3、定义函数 选择使用 哪一种 预处理方式
使用各种模型 对 各种处理后的 数据 进行测试
def select_preprocessor(model,name,X_train, X_test, y_train, y_test):
model.fit(X_train,y_train)
score = model.score(X_test,y_test)
print("{}模型 {}处理的数据 得分是{}".format(model.__class__.__name__,name,score))
# knn.__class__.__name__ 以这种方式提取模型名称
# 'KNeighborsClassifier'
4、使用各个模型进行数据预测
使用KNN模型进行预测
select_preprocessor(knn,'未',X_train1, X_test1, y_train1, y_test1 )
select_preprocessor(knn,'minmax',X_train2, X_test2, y_train2, y_test2 )
select_preprocessor(knn,'normal',X_train3, X_test3, y_train3, y_test3 )
select_preprocessor(knn,'standard',X_train4, X_test4, y_train4, y_test4 )
KNeighborsClassifier模型 未处理的数据 得分是0.8867924528301887
KNeighborsClassifier模型 minmax处理的数据 得分是0.9433962264150944
KNeighborsClassifier模型 normal处理的数据 得分是0.9056603773584906
KNeighborsClassifier模型 standard处理的数据 得分是0.8867924528301887
使用lgc模型进行预测
select_preprocessor(lgc,'未',X_train1, X_test1, y_train1, y_test1 )
select_preprocessor(lgc,'minmax',X_train2, X_test2, y_train2, y_test2 )
select_preprocessor(lgc,'normal',X_train3, X_test3, y_train3, y_test3 )
select_preprocessor(lgc,'standard',X_train4, X_test4, y_train4, y_test4 )
LogisticRegression模型 未处理的数据 得分是0.9245283018867925
LogisticRegression模型 minmax处理的数据 得分是0.9245283018867925
LogisticRegression模型 normal处理的数据 得分是0.7735849056603774
LogisticRegression模型 standard处理的数据 得分是0.8490566037735849
使用决策树模型进行预测
select_preprocessor(dtree,'未',X_train1, X_test1, y_train1, y_test1 )
select_preprocessor(dtree,'minmax',X_train2, X_test2, y_train2, y_test2 )
select_preprocessor(dtree,'normal',X_train3, X_test3, y_train3, y_test3 )
select_preprocessor(dtree,'standard',X_train4, X_test4, y_train4, y_test4 )
DecisionTreeClassifier模型 未处理的数据 得分是0.9056603773584906
DecisionTreeClassifier模型 minmax处理的数据 得分是0.9245283018867925
DecisionTreeClassifier模型 normal处理的数据 得分是0.8490566037735849
DecisionTreeClassifier模型 standard处理的数据 得分是0.9056603773584906
使用gnb(高斯)模型进行预测
select_preprocessor(gnb,'未',X_train1, X_test1, y_train1, y_test1 )
select_preprocessor(gnb,'minmax',X_train2, X_test2, y_train2, y_test2 )
select_preprocessor(gnb,'normal',X_train3, X_test3, y_train3, y_test3 )
select_preprocessor(gnb,'standard',X_train4, X_test4, y_train4, y_test4 )
GaussianNB模型 未处理的数据 得分是0.8679245283018868
GaussianNB模型 minmax处理的数据 得分是0.8867924528301887
GaussianNB模型 normal处理的数据 得分是0.8867924528301887
GaussianNB模型 standard处理的数据 得分是0.9433962264150944
使用svc模型进行预测
select_preprocessor(svc,'未',X_train1, X_test1, y_train1, y_test1 )
select_preprocessor(svc,'minmax',X_train2, X_test2, y_train2, y_test2 )
select_preprocessor(svc,'normal',X_train3, X_test3, y_train3, y_test3 )
select_preprocessor(svc,'standard',X_train4, X_test4, y_train4, y_test4 )
SVC模型 未处理的数据 得分是0.8679245283018868
SVC模型 minmax处理的数据 得分是0.9056603773584906
SVC模型 normal处理的数据 得分是0.24528301886792453
SVC模型 standard处理的数据 得分是0.9056603773584906
观察可以得出normal肯定是不用了 #其他方式都差不多 就可以不处理了
五、选择模型
选择模型主要是选择比较稳定的模型
1)获取数据
使用不处理的数据对模型进行训练,查看准确率
data
target
2)定义模型测试函数
定义函数
def select_model(model,data,target,rate):
X_train, X_test, y_train, y_test = train_test_split(data,target,test_size=rate)
model.fit(X_train,y_train)
score = model.score(X_test,y_test)
print(model.__class__.__name__+':'+str(score))
return score
# 传入一个列表 列表里面都是 各种模型
def select_model2(models,data,target):
for model in models:
score1 = select_model(model,data,target,0.1)
score2 = select_model(model,data,target,0.2)
score3 = select_model(model,data,target,0.3)
# 主要想看的是 平均分 和 标准差
nd = np.array([score1,score2,score3])
print('平均分:%f 标准差:%f'%(nd.mean(),nd.std()))
print('\n')
调用函数
select_model2([knn,lgc,dtree,gnb,svc],data,target)
KNeighborsClassifier:0.9047619047619048
KNeighborsClassifier:0.8333333333333334
KNeighborsClassifier:0.9206349206349206
平均分:0.886243 标准差:0.037970
LogisticRegression:1.0
LogisticRegression:0.9523809523809523
LogisticRegression:0.9047619047619048
平均分:0.952381 标准差:0.038881
DecisionTreeClassifier:0.9523809523809523
DecisionTreeClassifier:0.9047619047619048
DecisionTreeClassifier:0.8888888888888888
平均分:0.915344 标准差:0.026979
GaussianNB:0.8095238095238095
GaussianNB:0.8571428571428571
GaussianNB:0.9047619047619048
平均分:0.857143 标准差:0.038881
SVC:0.9523809523809523
SVC:0.8571428571428571
SVC:0.873015873015873
平均分:0.894180 标准差:0.041661