基于iris数据集测试不同机器学习分类器的准确率(上)

基于iris数据集测试不同机器学习分类器的准确率(上),第1张

机器学习分类算法的背后是统计。

针对分类问题,python的sklearn库中有很多分类器,例如K近邻、朴素贝叶斯、决策树和随机森林。在对样本做分类之前,还需要很多准备工作,而且在一次训练当中,对样本特征的处理往往占了超过80%的时间,这是因为只有获得了“好”数据,才能有“好”结果。分类器训练流程如下:

1.获取数据集并总览;
2.理解每个特征的含义并用不同方法处理缺失数据;
3.分析数据关系(找出特征之间或特征与结果之间的关系,将这种关系可视化,往往做报告时用到);
4.数据预处理的方法(标准化、归一化、降维);
5.特征工程(对数据进行特征提取)
6.超参数调试与训练分类器;
7.评估分类器准确性;

本文旨在基于iris数据集完整地过一遍分类器训练流程。

一、数据获取&总览

#1.read datasets :iris
from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
iris_data = pd.DataFrame(iris.data)
iris_data.columns = iris.feature_names

#观测数据前5行
iris_data.head()
#显示数据集中数据量可以清楚看到数据集是否缺失
iris_data.info()
#对数据信息进行描述包括每列对应的数量、方差平均值
iris_data.describe()

二、理解每个特征的含义并用不同方法处理缺失数据

iris是个玩具数据集,不存在缺失值。但在工作当中大概率会碰到某列数据缺失的情况,处理方式如下:

1.如果某个特征的数据很多,缺失值很少,可以删掉带缺失值的行;
2.如果某个特征相不是很重要,可以对它的缺失值赋均值或者众数;
3.如果某个特征代表类别,可以赋一个代表缺失的值,因为缺失本身也可能代表着一些隐含信息;
4.如果某个特征对模型影响比较大的参数可以先用一次机器学习算法预测缺失值并补充;

综上所述,在补充缺失值前需要对各个特征有了解和初步的重要性判断。

三、分析数据关系

步骤三往往和步骤二一起做,例如分析某个特征和结果的相关性——确定关键的特征,可以采用机器学习算法预测缺失值;如果某两个特征相关性很高——去点某个特征,当作降维,减小后面模型的计算量。

四、数据预处理的方法

#split iris data
#将数据集和目标值集划分成训练集和测试集
from sklearn.model_selection import train_test_split as ttsplit
d4train, d4test, t4train, t4test = ttsplit(iris.data, iris.target, stratify=iris.target,test_size=0.2)

#data process
#标准化
from sklearn.preprocessing import StandardScaler
trans = StandardScaler()
d4train = trans.fit_transform(d4train)
d4test = trans.transform(d4test)
#归一化
from sklearn.preprocessing import MinMaxScaler
trans = MinMaxScaler()
d4train = trans.fit_transform(d4train)
d4test = trans.transform(d4test)

如果某几列特征是数值类,可以通过归一化或标准化把它们拉到“同一起跑线”;

五、特征工程

这一步是训练分类器的关键,毕竟好的输入才能有好的输出。前文提到的对关键特征缺失值的补全就在这里完成。除此之外,降维、对字典或文本数据的特征提取也在这一步完成。

六、超参数调试与训练分类器&七、评估分类器准确性

训练、调参和评估往往是水到渠成的事,所以就放一起写了,直接上代码:

#gridCV
from sklearn.model_selection import GridSearchCV

#K近邻
from sklearn.neighbors import KNeighborsClassifier
estimator = KNeighborsClassifier()
nei = {'n_neighbors' : range(1,8)} #超参数

#决策树
from sklearn.tree import DecisionTreeClassifier
estimator = DecisionTreeClassifier()
from sklearn.model_selection import GridSearchCV
nei = {'criterion': ['gini', 'entropy'], 'max_depth': range(3, 10)}

#随机森林
from sklearn.ensemble import RandomForestClassifier
estimator = RandomForestClassifier()
from sklearn.model_selection import GridSearchCV
nei = {'criterion': ['gini', 'entropy'], 'max_depth': range(3, 10), 'n_estimators':[5,10,20],'max_features': [3, 4]}

#trianing model & 交叉验证
estimator = GridSearchCV(est, param_grid=nei, cv=8)
estimator.fit(d4train, t4train)

#score the fitted model
print('best result:\n', estimator.best_score_)
print('best params:\n', estimator.best_params_)

三种算法的结果展示

1.K近邻

2.决策树

3.随机森林

 朴素贝叶斯的用法也大差不差,在此不做赘述。从结果可以看到,对于规模小且数据完整的数据集,大家表现都挺好。。。

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/878082.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存