当前位置:首页|资讯|机器学习|编程

【环哥】机器学习入门体验(前篇)

作者:JackLloydSmith发布时间:2023-11-26

注:本文仅用于记录学习过程和展示实现方法,不展开机器学习的原理

首先是环境配置,以Python为例。如果只是想要体验一下机器学习,可以直接安装官方版本(https://www.python.org/downloads/)。但要注意版本号不宜太高,因为并非所有第三方模块都有良好的向上兼容性(比如之前直播时有同学推荐用autogluon实现机器学习模型的自动化调参,但autogluon 0.8.2对Python的版本要求为“Python >=3.8, <3.11”)。如果想要正经学一下编程,可以安装集成度更高的发行版,如Anaconda,省去常用第三方模块的安装。

本文以安装官方版本的情况为例,安装后请运行“命令提示符”,安装sklearn模块,命令为:

pip install scikit-learn

输入命令后按回车并等待安装结束即可。我这里因为安装过了,所以直接提示already satisfied。正常来说会同时将其依赖的其他模块一并安装(比如后面要用的numpy)。

在“命令提示符”中用pip安装模块

然后开始借(chao)鉴(xi)代码,我参考的资料是这篇博文“决策树鸢尾花算法讲解”(https://blog.csdn.net/godnightshao/article/details/129956427)

PS:注释是我重新写的

from sklearn.datasets import load_iris
#导入鸢尾花数据集命令
from sklearn.tree import DecisionTreeClassifier
#导入决策树分类命令(不是决策树回归,它们是俩玩意儿)
from sklearn.model_selection import train_test_split
#导入拆分训练集和验证集的命令

iris = load_iris()
#构造一个变量,变量内容是鸢尾花数据集

X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=0)
#拆分训练集和验证集,各自又分为特征和标签,共4个变量。括号里的4个参数依次是特征数据集、标签数据集、验证集比例、随机种子
#随机种子相当于指定了某一个特定的随机结果,是需要调优的参数之一。如果不设置该参数,则每次运行该命令拆分的结果都不一样

clf = DecisionTreeClassifier(random_state=0)
#构造一个变量,这个变量就是决策树分类模型
clf.fit(X_train, y_train)
#用训练集的特征和标签来训练模型

print("Test accuracy:", clf.score(X_test,y_test))
#打印模型的性能指标

打开IDLE,新建文件,把以上代码复制粘贴进去,保存,按F5运行即可,样子如下:

代码文件(不含注释)
运行结果

构造模型时(即clf = DecisionTreeClassifier(random_state=0)这一行)的参数设置都是默认的,可能需要调节的参数有很多,比如分支准则(criterion)、分支选择策略(splitter)、最大深度(max_depth)、最大特征数量(max_features),这里不做展开,请自行按需学习~

这里有一个问题,已知关于机器学习模型性能的评价指标有好几种,accuracy(准确率)、precision(精度、查准率)、recall(召回率、查全率)、F1 score,其中F1 score对于多分类问题又有micro和macro两种计算方式,为了弄清楚参考资料中的accuracy到底是什么,额外导入f1_score()命令,并在最后增加两个print()命令,改造后代码如下:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score

iris = load_iris()

X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=0)

clf = DecisionTreeClassifier(random_state=0)
clf.fit(X_train, y_train)

print("Test accuracy:", clf.score(X_test,y_test))
print("Test F1-micro:", f1_score(clf.predict(X_test), y_test,average='micro'))
print("Test F1-macro:", f1_score(clf.predict(X_test), y_test,average='macro'))

测试发现,score()命令返回的是micro口径的F1 score。测试比较粗糙,也可能结论不对,保险起见还是推荐用sklearn.metrics中的f1_score()命令。

clf.score()命令计算方式测试结果

这里还有一个问题,如果我想用自己的数据来训练,要怎么办呢。在运行结果窗口中分别用type()命令和print()命令看看数据集到底长什么样子。为了能显示的下,这里只打印了数据集的前5条内容。特征和标签都是numpy的N维数组(ndarray),特征数据集在形式上是:一个样本的N维特征为1个列表,所有样本外层再套1个列表。标签数据集在形式上直接就是1个列表,内容依次为每个样本对应的标签(鸢尾花的类别,一共3种,用0、1、2表示)。这就是用于构造自己的数据集的格式要求了。

看看数据集到底暗藏什么玄只因

假如,我们把自己的数据整理成如下格式,将其保存在data.txt中,与代码放在同一个目录下(这里还是用的鸢尾花数据集,只是为了演示如何改变读取数据的方式):
X1,X2,X3,X4,target
5.1,3.5,1.4,0.2,0
4.9,3.0,1.4,0.2,0
4.7,3.2,1.3,0.2,0
……

加入读取该文本并将其转为N维数组的命令后,代码如下(已经去掉了原本读取鸢尾花数据集的命令):

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
import numpy

f=open('data.txt',encoding='utf8').read().splitlines()[1:]
#从文本中读取内容,不含第一行(即去掉表头)

data=[] #构造一个变量,类型为列表,用于以样本为单位存放特征
target=[] #构造一个变量,类型为列表,用于以样本为单位存放标签

for i in f: #遍历每一行
    temp=[] #构造一个变量,类型为列表,用于存放一个样本的N维特征
    for X in i.split(',')[:4]: #遍历该行的前4项
        temp.append(float(X)) #将文本转为浮点型,再添加到temp中
    data.append(temp) #将temp添加到data中
    target.append(i.split(',')[4]) #将该行的第5项添加到target中

data=numpy.array(data) #转换成N维数组
target=numpy.array(target) #转换成N维数组

X_train, X_test, y_train, y_test = train_test_split(
    data, target, test_size=0.3, random_state=0)
#特征数据集和标签数据集已替换为自己的数据

clf = DecisionTreeClassifier(random_state=0)
clf.fit(X_train, y_train)

print("Test F1-micro:", f1_score(clf.predict(X_test), y_test,average='micro'))
print("Test F1-macro:", f1_score(clf.predict(X_test), y_test,average='macro'))

读取自己数据的决策树模型训练代码

今天的时间只够写这些了,一直到下周日每天都有短时讨论的安排,今天和明天还各有一个审稿截至,先这样吧。后篇会继续展示如何使用训练好的模型进行预测并输出预测结果(其实预测命令上面已经出现过了),以及利用optuna模块实现自动化参数调优。


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1