python 多分类模型优化_【Python与机器学习】:利用Keras进行多类分类
多类分类问题本质上可以分解为多个二分类问题,而解决二分类问题的方法有很多。这里我们利用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进行多类分类相关推荐
- 数学建模_随机森林分类模型详解Python代码
数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...
- python实现贝叶斯优化_贝叶斯优化的并行实现
python实现贝叶斯优化 The concept of 'optimization' is central to data science. We minimize loss by optimizi ...
- python 高维数据_用Sci-kit learn和XGBoost进行多类分类:Brainwave数据案例研究
在机器学习中,高维数据的分类问题非常具有挑战性.有时候,非常简单的问题会因为这个"维度诅咒"问题变得非常复杂.在本文中,我们将了解不同分类器的准确性和性能是如何变化的. 理解数据 ...
- python机械编程_机器学习编程作业3——多类分类(Python版)
本次编程作业的实现环境是Python3.Anaconda3(64-bit).Jupyter Notebook.是在深度之眼"机器学习训练营"作业基础上完成的,个别代码有修改,供交流 ...
- python 时间序列prophet 模型分析_手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)...
原标题:手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码) 作者:ANKIT CHOUDHARY:翻译:王雨桐:校对:丁楠雅: 本文约3000字,建议阅读12分钟. 本文将通过 ...
- python逻辑回归训练预测_[Python] 机器学习笔记 基于逻辑回归的分类预测
导学问题 什么是逻辑回归(一),逻辑回归的推导(二 3),损失函数的推导(二 4) 逻辑回归与SVM的异同 逻辑回归和SVM都用来做分类,都是基于回归的概念 SVM的处理方法是只考虑 support ...
- python实现人脸检测及识别(2)---- 利用keras库训练人脸识别模型
前面已经采集好数据集boss文件夹存放需要识别的对象照片,other存放其他人的训练集照片,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的tensorflo ...
- 吴恩达机器学习作业3:多类分类(Python实现)
机器学习练习 3 - 多类分类 在本练习中,您将实现一对一的逻辑回归和神经网络来识别手写的数字.在开始编程练习之前,我们强烈建议您观看视频讲座,并完成相关主题的复习问题.要开始这个练习,您需要下载启动 ...
- python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...
主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...
最新文章
- 从今天开始,学习Webpack,减少对脚手架的依赖(下)
- 启明云端分享|注意了,ESP-12F和ESP-12S虽然只有一个字母不同,但在选型时,要注意了,ESP-12F底部是有焊盘的!
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1103:陶陶摘苹果
- [转] Vuex入门(2)—— state,mapState,...mapState对象展开符详解
- html网页访问计数器,HTML添加网站计数器(Cookie)
- java系统系统异常处理,银行系统(Java)异常处理
- matlab的词云,Word Cloud (词云) - JavaScript
- DevOps实践-从0到1搭建敏捷团队的持续集成环境
- 使用memcachedclientXmemcached与Spring整合
- 在windows中使用scp命令将文件上传到远端服务器
- 【RS】OSPF邻居关系(1)--OSPF邻居表为空
- 修改rocketmq nameserver的默认端口号
- 程序员常见面试题汇总
- Photoshop插件-删除中间调通道蒙板-脚本开发-PS插件
- 稳压电源集成控制器的发展
- CSS 定位(position)
- Spring boot 中使用 Thymeleaf
- AOZ8902CIL 瞬态电压二极管,设计用于电路保护。
- 丹尼斯·里奇-c语言之父,Unix之父
- 小王的尴尬日常(一)--使用RSA公钥证书解密
热门文章
- Linux负载均衡Nginx六种策略
- linux usb 触摸屏驱动,请教大家一个linux下的usb触摸屏驱动的问题
- java安卓获取mac_android开发分享以编程方式获取Android设备的MAC
- vue中将md转成html,Vue/Vue中Html和Markdown互相转换/README.md · 倚栏听风/LearningNotes - Gitee.com...
- 学习Linux的一些建议
- html 按下和松开事件,利用JQuery实现一个键盘按下与松开触发事件
- html5点线的设置,html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点...
- 2021高考成绩查询系统 www.lzk.hl.cn,2021年黑龙江高考志愿在线填报网址入口:https://www.lzk.hl.cn/...
- java file类详解_Java File类详解及IO介绍及使用
- python mysqldb_python学习-使用MySQLdb操作mysql数据库