零起点Python机器学习快速入门【1.7】
5.3 AI操作流程
本节涉及部分人工智能的理论知识,其中某些内容有些抽象、拗口,如果大家感觉无法细分,属于正常情况,无须纠结,后面的案例会进行具体介绍。
1. 机器学习与测试数据集合
人工智能、机器学习通常都使用两组数据,一组作为训练数据,一组作为测试数据。
在每组数据中都包含一组多维的参数数据集作为特征数据集,以及一组一维的数组作为结果分类数据,从而形成 4 个数据集合。通常这 4 组数据变量的名称是:
x_train,训练数据,多维参数数据集。
y_train,训练数据,一维结果数据集。
x_test,测试数据,多维参数数据集。
y_test,测试数据,一维结果数据集。
习惯上, train 数据集用于训练, test 数据集用于测试。此外,通过对数据集 y_train 的分析,会生成一个新的预测结果数据集 y_pred,这个数据集也是一维的结果数据集。
通过对结果数据集 y_pred 与实际的测试数据集 y_test 进行对比,就可以检测算法模型的准确度。
2. 机器学习运行流程
通常人工智能、机器学习的算法流程如下:
选择模型函数 mx_fun, mx_fun 是我们自定义的机器学习函数接口。
把训练用的特征数据集 x_train 和对应的特征(结果)数据集 y_train,输入模型函数 mx_fun。
系统内置的机器学习函数,会自动分析特征数据与结果数据之间的关系。这样的一个过程就是机器学习的过程,也是算法建模的过程。
通过对训练数据的机器学习和数据分析,系统会生成一个 AI 机器学
习模型,我们将其保存到变量 mx。
把测试数据 x_test 输入模型变量 mx, mx 会调用内置的分析函数
predict,生成最终的分析结果 y_pred。
如果是实盘,输入最新的数据,例如今天的股市数据或正在销售的足彩比赛赔率数据,系统会自动生成相关的预测数据,如:每天或未来几天股市走势数据或比赛输赢结果。
在进行实盘运行之前,我们会对 y_pred 和正确结果数据 y_test 进行对比,以判断模型的准确程度,并通过一些优化措施和结果调整参数进行迭
代运算,或者采用其他的模型提高最终结果的准确度。以下是常用的 AI 运算流程:
选择模型函数 mx_fun 导入训练数据 建立算法模型 MX
输入测试(实盘)数据 x_test 调用 predict 分析(预测)函数 生成分析(预测)结果 y_pred
3. 经典机器学习算法
目前,人工智能、机器学习虽然光彩夺目,但还处于启蒙阶段,在本书的案例中,会涉及以下经典的机器学习算法。
线性回归算法,函数名: LinearRegression。
朴素贝叶斯算法, Multinomial Naive Bayes,函数名: Multinomialnb。
kNN 近邻算法,函数名: KNeighborsClassifier。
逻辑回归算法,函数名: LogisticRegression。
随机森林算法, Random Forest Classifier, 函数名: RandomForestClassifier。
决策树算法, Decision Tree,函数名: tree.DecisionTreeClassifier。
GBDT 迭代决策树算法, Gradient Boosting Decision Tree,又叫 MART
(Multiple Additive Regression Tree),函数名: GradientBoostingClassifier。
SVM 向量机算法,函数名: SVC。
SVM-cross 向量机交叉算法,函数名: SVC。
以上算法中的函数名,均为 Sklearn 模块库内置的函数名称,无须使用其他第三方模块库。所以,笔者说 Sklearn 模块库是初学者学习人工智能、机器学习的不二选择。
4. 黑箱大法
以上内容,还只是人工智能、机器学习最简单的部分。大部分初学者,即使克服种种困难,独自完成了人工智能、机器学习开发平台的配置,再面对这些拗口的算法名称,也基本上都会有崩溃的感觉。
其实这种现象很正常,因为这些算法、名称背后都有非常专业的理论和模型,其学术价值和专业难度都不亚于博士学位的研究。
不过,正如笔者前面所说的,初学者学习人工智能、机器学习最好从忘却开始。
同样,面对这些眼花缭乱的专业名称、术语,依然采用忘却的模式,采用黑箱大法,大家无须纠结各种算法背后的理论,只将其看作一个个黑箱函数即可:
输入数据 【黑箱分析】 获得结果
以上各种算法,我们甚至可以改名为 1 号函数、 2 号函数、 3 号函数等。
函数调用是 Python 语言的基本功,能够看到这里的读者,相信无论对函数的调用还是编程都已经非常熟悉。
市场经济讲究的是结果导向,对于大部分学习者而言,需要的也只是一个最终结果数据。
如此一来, 99%的人工智能理论知识,大家都可以只是简单了解,然后直接调用相关的函数,获取最后的结果即可。
人工智能、机器学习领域的专家学者,也可以采用这种黑箱模式,有了结果数据,再学习理论和算法,也有了具体的数据支持和更多的感性认识,研究过程也会事半功倍。
5.4 数据切割函数
稍后的案例 5-3 会涉及第一个 Sklearn 的专业函数:
train_test_split
train_test_split 函数只是对数据进行切割,属于数据预处理函数,并非正式的人工智能、机器学习函数。
我们也可以通过其他函数或者自行编写的函数完成类似的功能。在前面的案例中,数据文件的切割也有类似的功能,事实上,足彩版本的足彩数据机器学习建模使用的数据源,正是我们自定义的数据切割函数。
对于普通的小型数据集合而言, Sklearn 内置的 train_test_split 函数使用更加方便。
train_test_split 数据切割函数位于 Sklearn 的 cross_validation 子模块中,功能是从样本中按比例随机选取 train data 和 test data,调用格式一般为:
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=0)
其中:
x 是训练参数的数据集合。
y 是训练参数 x 对应的结果数据集合。
test_size 是样本占比,如果是整数,就是样本的数量。
random_state 是随机数的种子。
案例 5-3 的文件名是 zai103_iris03.py,具体讲解如何切割相关的数据,下面分组进行介绍。
第 1 组代码,读取 Iris 数据文件,并保存到 df 变量:
#1
fss='dat/iris2.csv'
df=pd.read_csv(fss,index_col=False)
请注意,这里使用的是我们修改后、增加了 xid 的爱丽丝数据源文件。
第 2 组代码,输出 df 数据信息:
#2
print('\n2#df')
print(df.tail())
对应的输出信息是:
x1 x2 x3 x4 xname xid
145 6.7 3.0 5.2 2.3 virginica 1
146 6.3 2.5 5.0 1.9 virginica 1
147 6.5 3.0 5.2 2.0 virginica 1
148 6.2 3.4 5.4 2.3 virginica 1
149 5.9 3.0 5.1 1.8 virginica 1
第 3 组代码,根据人工智能、机器学习算法要求,设置总的数据源 x、 y:
#3
xlst,ysgn=['x1','x2','x3','x4'],'xid'
x,y= df[xlst],df[ysgn]
#
print('\n3# xlst,',xlst)
print('ysgn,',ysgn)
print('x')
print(x.tail())
print('y')
print(y.tail())
对应的输出信息是:
3# xlst, ['x1', 'x2', 'x3', 'x4']
ysgn, xid
x
x1 x2 x3 x4
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
y
145 1
146 1
147 1
148 1
149 1
Name: xid, dtype: int64
第 4 组代码,生成 x_train、 x_test、 y_train、 y_test 数据,并输出相关
数据的格式信息:
#4
x_train, x_test, y_train, y_test = train_test_split(x, y,
random_state=1)
x_test.index.name,y_test.index.name='xid','xid'
print('\n4# type')
print('type(x_train),',type(x_train))
print('type(x_test),',type(x_test))
print('type(y_train),',type(y_train))
print('type(y_test),',type(y_test))
对应的输出信息是:
4# type
type(x_train), <class 'pandas.core.frame.DataFrame'>
type(x_test), <class 'pandas.core.frame.DataFrame'>
type(y_train), <class 'pandas.core.series.Series'>
type(y_test), <class 'pandas.core.series.Series'>
第 5 组代码,保存相关的数据:
#5
fs0='tmp/iris_'
print('\n5# fs0,',fs0)
x_train.to_csv(fs0+'xtrain.csv',index=False);
x_test.to_csv(fs0+'xtest.csv',index=False)
y_train.to_csv(fs0+'ytrain.csv',index=False,header=True)
y_test.to_csv(fs0+'ytest.csv',index=False,header=True)
需要注意的是以下代码:
y_test.to_csv(fs0+'ytest.csv',index=False,header=True)
其中的 header 参数我们很少使用,这里用于强制保存 xid 字段头信息,
不然 y 数据集会缺少字段头 xid,少一行数据,与 x 数据集尺寸不匹配。大
家可以自己测试一下,看看 header 值为 False 的结果。
对应的输出信息如下:
5# fs0, tmp/iris_
需要说明的是,以上数据我们均会复制到 dat 目录中,以用于稍后的案
例中。
第 6 组代码,输出 x 数据集:
#6
print('\n6# x_train')
print(x_train.tail())
print('\nx_test')
print(x_test.tail())
对应的输出信息如下:
6# x_train
x1 x2 x3 x4
133 6.3 2.8 5.1 1.5
137 6.4 3.1 5.5 1.8
72 6.3 2.5 4.9 1.5
140 6.7 3.1 5.6 2.4
37 4.9 3.1 1.5 0.1
x_test
x1 x2 x3 x4
xid
128 6.4 2.8 5.6 2.1
114 5.8 2.8 5.1 2.4
48 5.3 3.7 1.5 0.2
53 5.5 2.3 4.0 1.3
28 5.2 3.4 1.4 0.2
第 7 组代码,输出 y 数据集:
#7
print('\n7# y_train')
print(y_train.tail())
print('\ny_test')
print(y_test.tail())
对应的输出信息如下:
7# y_train
133 1
137 1
72 3
140 1
37 2
Name: xid, dtype: int64
y_test
xid
128 1
114 1
48 2
53 3
28 2
Name: xid, dtype: int64
案例 5-4:线性回归算法
有了合适的训练数据和测试数据,人工智能真的很简单,只要两三个函数,就可完成相关的人工智能、机器学习编程。
案例 5-4 的文件名为 zai104_iris04.py,是 100%的人工智能、机器学习程序,是人工智能中最常用的线性回归算法,通过对输入数据的学习,自动对测试数据进行分类。
百度百科对应的线性回归词条是:线性回归是利用数理统计中的回归分析,来确定两种或两种以上变量之间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为 y = w'x+e, e 为误差,服从均值为 0 的正态分布。案例 5-4 采用的是线性回归算法,如图 5-2 所示。

线性回归算法是最简单、最经典、最古老的人工智能算法,其背后的理论非常复杂,在此,我们采用前面所说的黑箱模式,不予深入讨论,有兴趣的读者请自行参考相关资料。
下面逐一对程序代码进行讲解。
第 1 组代码很简单,读取训练数据,并保存到相关变量:
1
fs0='dat/iris_'
print('\n1# fs0,',fs0)
x_train=pd.read_csv(fs0+'xtrain.csv',index_col=False);
y_train=pd.read_csv(fs0+'ytrain.csv',index_col=False);
第 2 组代码,输出部分训练数据尾部:
#2
print('\n2# train')
print(x_train.tail())
print(y_train.tail())
对应的输出信息如下:
2# train
x1 x2 x3 x4
107 6.3 2.8 5.1 1.5
108 6.4 3.1 5.5 1.8
109 6.3 2.5 4.9 1.5
110 6.7 3.1 5.6 2.4
111 4.9 3.1 1.5 0.1
xid
107 1
108 1
109 3
110 1
111 2
第 3 组代码,调用机器学习函数,通过对输入数据的分析、学习,建
立机器学习模型,并保存到变量 mx:
#3
print('\n3# 建模')
mx =zai.mx_line(x_train.values,y_train.values)
本案例中第 3 组代码使用的是线性回归算法建立机器学习模型,但是并没有直接调用 Sklearn 模块库中的 LinearRegression 线性回归函数,而是通过 ztop_ai 极宽智能模块库中的 mx_line 函数接口间接进行调用,对应的函数代码是:
def mx_line(train_x, train_y):
mx = LinearRegression()
mx.fit(train_x, train_y)
#print('\nlinreg.intercept_')
#print (mx.intercept_);print (mx.coef_)
return mx
线性回归函数位于 sklearn.linear_model 模块中,函数接口是:
LinearRegression(fit_intercept=True, normalize=False, copy_X=
True, n_jobs=1)
mx_line 函数代码很简单,调用基于最小二乘法的 LinearRegression 线性回归函数生成模型变量 mx,运行内置的 fit 命令,分析学习训练数据: train_x(训练数据)、 train_y(训练数据对应的答案)。
Sklearn 模块库中的各种机器学习函数,基本上都是采用 fit 命令自动学习、建立模型。
采用 ztop_ai 极宽智能模块库中的 mx_xxx 系列函数,对 Sklearn 模块的各种智能算法函数进行二次封装,其优点是:
统一调用接口,规范函数 API 调用模式。
无须直接面对底层的机器学习函数,如 LinearRegression,无须了解
相关的理论知识即可直接使用。
如果不考虑各种复杂的机器学习函数名称,只需记住 mx_xxx 系列函数,那么建模就基本简化成一个最简单的 fit 内置函数了。
第 4 组代码,读入测试数据并输出相关信息:
#4
x_test=pd.read_csv(fs0+'xtest.csv',index_col=False)
df9=x_test.copy()
print('\n4# x_test')
print(x_test.tail())
对应的输出信息是:
4# x_test
x1 x2 x3 x4
33 6.4 2.8 5.6 2.1
34 5.8 2.8 5.1 2.4
35 5.3 3.7 1.5 0.2
36 5.5 2.3 4.0 1.3
37 5.2 3.4 1.4 0.2
第 5 组代码,运行机器学习变量 mx 的内置函数 predict,生成结果数据:
#5
print('\n5# 预测')
y_pred = mx.predict(x_test.values)
df9['y_predsr']=y_pred
第 6 组代码,读入训练数据的正确答案,并保存到变量 y_test:
#6
y_test=pd.read_csv(fs0+'ytest.csv',index_col=False)
print('\n6# y_test')
print(y_test.tail())
对应的输出信息是:
6# y_test
xid
33 1
34 1
35 2
36 3
37 2
需要注意的是,本案例为了强调学习,特意把实盘数据放在 predict 函数之后,在生成结果或者预测数据之后再读入,以强调两者之间是完全独立的。
第 7 组代码,整理结果数据变量 df9,并保存到文件中:
#7
df9['y_test'],df9['y_pred']=y_test,y_pred
df9['y_pred']=round(df9['y_predsr']).astype(int)
df9.to_csv('tmp/iris_9.csv',index=False)
print('\n7# df9')
print(df9.tail())
对应的输出信息是:
7# df9
x1 x2 x3 x4 y_predsr y_test y_pred
33 6.4 2.8 5.6 2.1 1.551677 1 2
34 5.8 2.8 5.1 2.4 1.209887 1 1
35 5.3 3.7 1.5 0.2 2.093058 2 2
36 5.5 2.3 4.0 1.3 2.317451 3 2
37 5.2 3.4 1.4 0.2 2.300976 2 2
大家可以自己打开结果文件,查看相关的结果,其中 y_test 是实盘真
实的数据结果, y_pred 是程序生成的结果数据。
第 8 组代码,检验测试结果:
#8
dacc=zai.ai_acc_xed(df9,1,False)
print('\n8# mx:mx_sum,kok:{0:.2f}%'.format(dacc))
在本案例中测试结果数据使用的是 ztop_ai 极宽智能模块库中的 zai.ai_ acc_xed 函数,这个函数目前有些超前,在后面的章节中再进行详细讲解。
第 8 组代码,对应的输出信息是:
8# mx:mx_sum,kok:44.74%
由结果数据可以看出,线性回归的准确率有些低,只有 44.74%,不过这个案例是三选一,相比 33%的随机概率还是提高了不少。
至此,一个完整的人工智能、机器学习程序就完成了。虽然有些简陋,但毕竟只是一个开始。众所周知,从 0 到 1 是一个艰难而又漫长的过程,也是一个质变的过程。
“月球的一小步,人类的一大步”。至此,大家迈出了人工智能、机器学习的第一步。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)