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

1. 编码输出便签

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

sample, label

1, Iris-setosa

2, Iris-versicolor

3, Iris-virginica

用one hot encoding转化后如下:

sample, Iris-setosa, Iris-versicolor, Iris-virginica

1, 1, 0, 0

2, 0, 1, 0

3, 0, 0, 1

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

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

2. 构建神经网络模型

Keras是基于Theano或Tensorflow底层开发的简单模块化的神经网络框架,因此用Keras搭建网络结构会比Tensorflow更加简单。这里我们将使用Keras提供的KerasClassifier类,这个类可以在scikit-learn包中作为Estimator使用,故利用这个类我们就可以方便的调用sklearn包中的一些函数进行数据预处理和结果评估(此为sklearn包中模型(model)的基本类型)。

对于网络结构,我们采用3层全向连接的,输入层有4个节点,隐含层有10个节点,输出层有3个节点的网络。其中,隐含层的激活函数为relu(rectifier),输出层的激活函数为softmax。损失函数则相应的选择categorical_crossentropy(此函数来着theano或tensorflow,具体可以参见这里)(二分类的话一般选择activation=‘sigmoid’, loss=‘binary_crossentropy’)。

PS:对于多类分类网络结构而言,增加中间隐含层能够提升训练精度,但是所需的计算时间和空间会增大,因此需要测试选择一个合适的数目,这里我们设为10;此外,每一层的舍弃率(dropout)也需要相应调整(太高容易欠拟合,太低容易过拟合),这里我们设为0.2。

3. 评估模型

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

4. 代码实现

import numpy as np

import pandas as pd

from keras.models import Sequential

from keras.layers import Dense, Dropout

from keras.wrappers.scikit_learn import KerasClassifier

from keras.utils import np_utils

from sklearn.model_selection import train_test_split, KFold, cross_val_score

from sklearn.preprocessing import LabelEncoder

# load dataset

dataframe = pd.read_csv("iris.csv", header=None)

dataset = dataframe.values

X = dataset[:, 0:4].astype(float)

Y = dataset[:, 4]

# encode class values as integers

encoder = 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 structure

def 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 model

estimator = 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 predictions

pred = estimator.predict(X_test)

# inverse numeric variables to initial categorical labels

init_lables = encoder.inverse_transform(pred)

# k-fold cross-validate

seed = 42

np.random.seed(seed)

kfold = KFold(n_splits=10, shuffle=True, random_state=seed)

results = cross_val_score(estimator, X, dummy_y, cv=kfold)

5. 参考

python 多分类模型优化_【Python与机器学习】:利用Keras进行多类分类相关推荐

  1. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

  2. python实现贝叶斯优化_贝叶斯优化的并行实现

    python实现贝叶斯优化 The concept of 'optimization' is central to data science. We minimize loss by optimizi ...

  3. python 高维数据_用Sci-kit learn和XGBoost进行多类分类:Brainwave数据案例研究

    在机器学习中,高维数据的分类问题非常具有挑战性.有时候,非常简单的问题会因为这个"维度诅咒"问题变得非常复杂.在本文中,我们将了解不同分类器的准确性和性能是如何变化的. 理解数据 ...

  4. python机械编程_机器学习编程作业3——多类分类(Python版)

    本次编程作业的实现环境是Python3.Anaconda3(64-bit).Jupyter Notebook.是在深度之眼"机器学习训练营"作业基础上完成的,个别代码有修改,供交流 ...

  5. python 时间序列prophet 模型分析_手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)...

    原标题:手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码) 作者:ANKIT CHOUDHARY:翻译:王雨桐:校对:丁楠雅: 本文约3000字,建议阅读12分钟. 本文将通过 ...

  6. python逻辑回归训练预测_[Python] 机器学习笔记 基于逻辑回归的分类预测

    导学问题 什么是逻辑回归(一),逻辑回归的推导(二 3),损失函数的推导(二 4) 逻辑回归与SVM的异同 逻辑回归和SVM都用来做分类,都是基于回归的概念 SVM的处理方法是只考虑 support ...

  7. python实现人脸检测及识别(2)---- 利用keras库训练人脸识别模型

    前面已经采集好数据集boss文件夹存放需要识别的对象照片,other存放其他人的训练集照片,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的tensorflo ...

  8. 吴恩达机器学习作业3:多类分类(Python实现)

    机器学习练习 3 - 多类分类 在本练习中,您将实现一对一的逻辑回归和神经网络来识别手写的数字.在开始编程练习之前,我们强烈建议您观看视频讲座,并完成相关主题的复习问题.要开始这个练习,您需要下载启动 ...

  9. python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...

    主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...

最新文章

  1. 从今天开始,学习Webpack,减少对脚手架的依赖(下)
  2. 启明云端分享|注意了,ESP-12F和ESP-12S虽然只有一个字母不同,但在选型时,要注意了,ESP-12F底部是有焊盘的!
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1103:陶陶摘苹果
  4. [转] Vuex入门(2)—— state,mapState,...mapState对象展开符详解
  5. html网页访问计数器,HTML添加网站计数器(Cookie)
  6. java系统系统异常处理,银行系统(Java)异常处理
  7. matlab的词云,Word Cloud (词云) - JavaScript
  8. DevOps实践-从0到1搭建敏捷团队的持续集成环境
  9. 使用memcachedclientXmemcached与Spring整合
  10. 在windows中使用scp命令将文件上传到远端服务器
  11. 【RS】OSPF邻居关系(1)--OSPF邻居表为空
  12. 修改rocketmq nameserver的默认端口号
  13. 程序员常见面试题汇总
  14. Photoshop插件-删除中间调通道蒙板-脚本开发-PS插件
  15. 稳压电源集成控制器的发展
  16. CSS 定位(position)
  17. Spring boot 中使用 Thymeleaf
  18. AOZ8902CIL 瞬态电压二极管,设计用于电路保护。
  19. 丹尼斯·里奇-c语言之父,Unix之父
  20. 小王的尴尬日常(一)--使用RSA公钥证书解密

热门文章

  1. Linux负载均衡Nginx六种策略
  2. linux usb 触摸屏驱动,请教大家一个linux下的usb触摸屏驱动的问题
  3. java安卓获取mac_android开发分享以编程方式获取Android设备的MAC
  4. vue中将md转成html,Vue/Vue中Html和Markdown互相转换/README.md · 倚栏听风/LearningNotes - Gitee.com...
  5. 学习Linux的一些建议
  6. html 按下和松开事件,利用JQuery实现一个键盘按下与松开触发事件
  7. html5点线的设置,html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点...
  8. 2021高考成绩查询系统 www.lzk.hl.cn,2021年黑龙江高考志愿在线填报网址入口:https://www.lzk.hl.cn/...
  9. java file类详解_Java File类详解及IO介绍及使用
  10. python mysqldb_python学习-使用MySQLdb操作mysql数据库