博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Python与机器学习】:利用Keras进行多类分类
阅读量:7049 次
发布时间:2019-06-28

本文共 3115 字,大约阅读时间需要 10 分钟。

多类分类问题本质上可以分解为多个二分类问题,而解决二分类问题的方法有很多。这里我们利用Keras机器学习框架中的ANN(artificial neural network)来解决多分类问题。这里我们采用的例子是著名的UCI Machine Learning Repository中的鸢尾花数据集()。

1. 编码输出便签

多类分类问题与二类分类问题类似,需要将类别变量(categorical function)的输出标签转化为数值变量。这个问题在二分类的时候直接转换为(0,1)(输出层采用)或(-1,1)(输出层采用)。类似的,在多分类问题中我们将转化为虚拟变量(dummy variable):即用one hot encoding方法将输出标签的向量(vector)转化为只在出现对应标签的那一列为1,其余为0的布尔矩阵。以我们所用的鸢尾花数据为例:

sample,    label1,        Iris-setosa2,        Iris-versicolor3,        Iris-virginica

用one hot encoding转化后如下:

sample, Iris-setosa, Iris-versicolor, Iris-virginica1,        1,            0,                02,        0,            1,                03,        0,            0,                1

注意这里不要将label直接转化成数值变量,如1,2,3,这样的话与其说是预测问题更像是回归预测的问题,后者的难度比前者大。(当类别比较多的时候输出值的跨度就会比较大,此时输出层的激活函数就只能用linear)

这一步转化工作我们可以利用keras中的np_utils.to_categorical函数来进行。

2. 构建神经网络模型

是基于Theano或Tensorflow底层开发的简单模块化的神经网络框架,因此用Keras搭建网络结构会比Tensorflow更加简单。这里我们将使用Keras提供的类,这个类可以在scikit-learn包中作为Estimator使用,故利用这个类我们就可以方便的调用sklearn包中的一些函数进行数据预处理和结果评估(此为sklearn包中模型(model)的基本类型)。
对于网络结构,我们采用3层全向连接的,输入层有4个节点,隐含层有10个节点,输出层有3个节点的网络。其中,隐含层的激活函数为relu(),输出层的激活函数为。损失函数则相应的选择(此函数来着theano或tensorflow,具体可以参见)(二分类的话一般选择activation=‘sigmoid’, loss=‘binary_crossentropy’)。
PS:对于多类分类网络结构而言,增加中间隐含层能够提升训练精度,但是所需的计算时间和空间会增大,因此需要测试选择一个合适的数目,这里我们设为10;此外,每一层的舍弃率(dropout)也需要相应调整(太高容易欠拟合,太低容易过拟合),这里我们设为0.2。

3. 评估模型

这里我们利用评估机器学习模型的经典方法: k折交叉检验()。这里我们采用10折(k=10)。

4. 代码实现

import numpy as npimport pandas as pdfrom keras.models import Sequentialfrom keras.layers import Dense, Dropoutfrom keras.wrappers.scikit_learn import KerasClassifierfrom keras.utils import np_utilsfrom sklearn.model_selection import train_test_split, KFold, cross_val_scorefrom sklearn.preprocessing import LabelEncoder# load datasetdataframe = pd.read_csv("iris.csv", header=None)dataset = dataframe.valuesX = dataset[:, 0:4].astype(float)Y = dataset[:, 4]# encode class values as integersencoder = LabelEncoder()encoded_Y = encoder.fit_transform(Y)# convert integers to dummy variables (one hot encoding)dummy_y = np_utils.to_categorical(encoded_Y)# define model structuredef baseline_model():    model = Sequential()    model.add(Dense(output_dim=10, input_dim=4, activation='relu'))    model.add(Dropout(0.2))    model.add(Dense(output_dim=3, input_dim=10, activation='softmax'))    # Compile model    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])    return modelestimator = KerasClassifier(build_fn=baseline_model, nb_epoch=40, batch_size=256)# splitting data into training set and test set. If random_state is set to an integer, the split datasets are fixed.X_train, X_test, Y_train, Y_test = train_test_split(X, dummy_y, test_size=0.3, random_state=0)estimator.fit(X_train, Y_train)# make predictionspred = estimator.predict(X_test)# inverse numeric variables to initial categorical labelsinit_lables = encoder.inverse_transform(pred)# k-fold cross-validateseed = 42np.random.seed(seed)kfold = KFold(n_splits=10, shuffle=True, random_state=seed)results = cross_val_score(estimator, X, dummy_y, cv=kfold)

5. 参考

转载于:https://www.cnblogs.com/arkenstone/p/5943489.html

你可能感兴趣的文章
Struts2教程3:struts.xml常用配置解析
查看>>
(转帖)Implementing custom JavaFx Bindings
查看>>
mysql外键
查看>>
转发和重定向的区别
查看>>
<ecmall> ECMall的MySQL数据库调用
查看>>
SugarCRM - 如何修改默认首页
查看>>
Java日期类总结
查看>>
开关标识一个是0一个是-那个是开哪个是关
查看>>
ruby的并发和并行
查看>>
朱晶晶-六步制定好企业移动化战略
查看>>
SVPullToRefresh
查看>>
SSIndicatorLabel
查看>>
ASFBPostController
查看>>
Android实战技巧:Handler
查看>>
JqueryMobile实践点滴
查看>>
teamtalk服务端之完美一键部署脚本(ubuntu)
查看>>
2014.7.26 为cocos2d-x3.2版本增加protobuffer2.5.0支持
查看>>
Java进阶篇设计模式之一 ----- 单例模式
查看>>
字符串循环右移算法
查看>>
一分钟了解数据库扩展
查看>>