https://blog.csdn.net/zlrai5895/article/details/79560353

多类分类问题本质上可以分解为多个二分类问题,而解决二分类问题的方法有很多。这里我们利用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的布尔矩阵。以我们所用的鸢尾花数据为例:

  1. sample, label
  2. 1, Iris-setosa
  3. 2, Iris-versicolor
  4. 3, Iris-virginica

用one hot encoding转化后如下:

  1. sample, Iris-setosa, Iris-versicolor, Iris-virginica
  2. 1, 1, 0, 0
  3. 2, 0, 1, 0
  4. 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. 代码实现

  1. import numpy as np
  2. import pandas as pd
  3. from keras.models import Sequential
  4. from keras.layers import Dense, Dropout
  5. from keras.wrappers.scikit_learn import KerasClassifier
  6. from keras.utils import np_utils
  7. from sklearn.model_selection import train_test_split, KFold, cross_val_score
  8. from sklearn.preprocessing import LabelEncoder
  9.  
  10. # load dataset
  11. dataframe = pd.read_csv("iris.csv", header=None)
  12. dataset = dataframe.values
  13. X = dataset[:, 0:4].astype(float)
  14. Y = dataset[:, 4]
  15.  
  16. # encode class values as integers
  17. encoder = LabelEncoder()
  18. encoded_Y = encoder.fit_transform(Y)
  19. # convert integers to dummy variables (one hot encoding)
  20. dummy_y = np_utils.to_categorical(encoded_Y)
  21.  
  22. # define model structure
  23. def baseline_model():
  24. model = Sequential()
  25. model.add(Dense(output_dim=10, input_dim=4, activation='relu'))
  26. model.add(Dropout(0.2))
  27. model.add(Dense(output_dim=3, input_dim=10, activation='softmax'))
  28. # Compile model
  29. model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  30. return model
  31. estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=40, batch_size=256)
  32. # splitting data into training set and test set. If random_state is set to an integer, the split datasets are fixed.
  33. X_train, X_test, Y_train, Y_test = train_test_split(X, dummy_y, test_size=0.3, random_state=0)
  34. estimator.fit(X_train, Y_train)
  35.  
  36. # make predictions
  37. pred = estimator.predict(X_test)
  38.  
  39. # inverse numeric variables to initial categorical labels
  40. init_lables = encoder.inverse_transform(pred)
  41.  
  42. # k-fold cross-validate
  43. seed = 42
  44. np.random.seed(seed) # numpy.random.seed()的使用
  45. kfold = KFold(n_splits=10, shuffle=True, random_state=seed)
  46. results = cross_val_score(estimator, X, dummy_y, cv=kfold)

fit_transform()和transform()的区别

np_utils.to_categorical的更多相关文章

  1. TypeError: to_categorical() got an unexpected keyword argument 'nb_classes'

    在学习莫烦教程中keras教程时,报错:TypeError: to_categorical() got an unexpected keyword argument 'nb_classes',代码如下 ...

  2. [Keras] Develop Neural Network With Keras Step-By-Step

    简单地训练一个四层全连接网络. Ref: http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/ 1 ...

  3. 如何用卷积神经网络CNN识别手写数字集?

    前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...

  4. [Keras] mnist with cnn

    典型的卷积神经网络. Keras傻瓜式读取数据:自动下载,自动解压,自动加载. # X_train: array([[[[ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0. ...

  5. Keras学习~试用卷积~跑CIFAR-10

    import numpy as np import cPickle import keras as ks from keras.layers import Dense, Activation, Fla ...

  6. Keras学习~第一个例子~跑MNIST

    import numpy as npimport gzip import struct import keras as ks import logging from keras.layers impo ...

  7. Keras

    sudo pip install keras --安装 新建一个文件,里面存储的数据:第一列是属性,第二列是类别 11220044 011220044 011220044 011220033 1112 ...

  8. 用keras的cnn做人脸分类

    keras介绍 Keras是一个简约,高度模块化的神经网络库.采用Python / Theano开发. 使用Keras如果你需要一个深度学习库: 可以很容易和快速实现原型(通过总模块化,极简主义,和可 ...

  9. 【Python与机器学习】:利用Keras进行多类分类

    多类分类问题本质上可以分解为多个二分类问题,而解决二分类问题的方法有很多.这里我们利用Keras机器学习框架中的ANN(artificial neural network)来解决多分类问题.这里我们采 ...

随机推荐

  1. 如何评价 GitHub 发布的文本编辑器 Atom?

    这里是HN上的讨论:GitHub's new text editor leaked on Twitter这里是github page:Atom · GitHub 好多repo啊我不知道有没有知友了解更 ...

  2. ubuntu live cd修复grub引导项

    1. 通过Ubuntu Live CD(安装盘,选择try Ubuntu)进入Ubuntu系统 打开终端,依次进行如下操作: 1. sudo fdisk -l 出现如下界面: 2. 然后会看到,有好多 ...

  3. 解決從Ubuntu 12.04升級至12.10之後的Unity顯示問題

    FROM: http://blog.sina.com.cn/s/blog_97ef3ff4010190pe.html#bsh-75-306370781 今天中午經過系統自帶的“檢查更新”軟件從Ubun ...

  4. Jquery.data()的值存放再什么地方的问题?

    Where is jQuery.data() stored? Where does jQuery store the values of the data() that it sets to DOM ...

  5. CSS字体中英文名称对照表(转)

      在css文件中,我们常看到有些字体名称变成了乱码,这是由于网页开发者将中文字体的名字直接写成了中文,而css文件本身没有声明字符编码方式,查看时就出现了乱码.为了避免这种乱码状况出现,可以将css ...

  6. Java + Selenium + WebDriver八大元素定位方式

    UI自动化测试的第一步就是进行元素定位,下面给大家介绍一下Selenium + WebDriver的八大元素定位方式.现在我们就以百度搜索框为例进行元素定位,如下图: 一.By.name() Java ...

  7. c#关于路径的总结(转) 虚拟路径波浪号~和斜杠/的区别

    c#关于路径的总结(转)   来源:http://www.cnblogs.com/yugongmengjiutian/articles/5521165.html 前一段时间写代码时经常遇到获取路径问题 ...

  8. 面向对象-Object类

    一.Object类中的equals()方法 equals(Object obj) :指示其它某个对象是否与此对象"相等". 返回值类型是boolean Oblect类中的equal ...

  9. requests ssl 报错

    使用requests下载日志出现HTTPSConnectionPool(host='***', port=443): Max retries exceeded with url: ******(Cau ...

  10. different between method and function

    A method is on an object. A function is independent of an object. For Java, there are only methods. ...