scikitlearn/theano多分类问题详解

原创 2016年08月29日 12:51:46
入门先看下面两个网址
二分类:
http://python.jobbole.com/82208/
多分类:
http://blog.csdn.net/han_xiaoyang/article/details/50521072

下面说说改进及注意点:
上述博客的数据例子都是根据自己的意思随机生成的。
这边用iris数据进行扩展
由于iris数据是像下面这样的:
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
。。。。。。。
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
。。。。。。。
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica

一共150行,每行4个特征外加1个类别,共3种类别
所以神经网络作如下设置
class Config:
    nn_input_dim = 4  # 4个特征
    nn_output_dim = 3  # 3种类
    # Gradient descent parameters (I picked these by hand)
    epsilon = 0.01  # learning rate for gradient descent
    reg_lambda = 0.01  # regularization strength

最后一列代表花的种类,原数据是用名称代替的,这也是我们在多分类中经常碰到的。所以这里要转换为数字。
所以我们在程序里需要进行改动,如下:
t = np.zeros(len(labelMat))
    #将target阵列中特定元素的位置设置为对应整数(真简洁)
    t[labelMat == 'Iris-setosa'] = 0   #注意这里只能是0开始定义
    t[labelMat == 'Iris-versicolor'] = 1
    t[labelMat == 'Iris-virginica'] = 2
model = build_model(X, t, 5, print_loss=True)

注意这里的0,1,2。我最开始想弄随便弄个什么数,比如1,2,3的,反正都是求概率。后来发现行不通。
最后又仔细研读了下代码
注意程序里有个probs,
这是个概率矩阵,比如这里就是150*3的矩阵
每一行的3个数分别代表了属于三个类的概率。
虽说这3个概率跟具体的类别用什么数字或者符号代替没啥关系。但是注意到,要想获得者三个概率,得用索引来从矩阵probs中获得啊。。。。所以必须从0开始依次增大。。。。

于是想起来以前Theano中一些深度学习的例子。原例子是对mnist进行数字识别的。是多分类。不过很巧的是,它识别的数字种类正好是0,1,2,3,4...是从0开始的,也就没仔细想。
于是又用iris数据集在Theano的DBN上跑了一遍,还是得把类别转换为0,1,2才能跑,不能是其他数字。道理和上面类似。
说到这里,再扯远一点。原来DBN的例子中值是训练加批量测试,没有给出具体的预测/分类方法。
于是我自己改了一下:
在test_DBN()函数中将验证好的模型存为best_DBN_model.pkl。然后在预测函数中,如下设置
DBN_model = pickle.load(open('best_DBN_model.pkl'))

    # compile a predictor function
    predict_model = theano.function(
            inputs=[DBN_model.x],
            outputs=DBN_model.logLayer.y_pred
        )
注意这里DBN_model.x这样设置是因为def __init__函数中进行了如下设置
self.x = T.matrix('x') 
self.y = T.ivector('y')
x即特征矩阵集,y即标签矩阵集
而这里DBN网络最上面是由一层logistic回归输出的(准确地说是softmax)在logistic_sgd.py文件中有如下定义:
self.y_pred = T.argmax(self.p_y_given_x, axis=1)
这就跟我们上文中神经网络代码中的return np.argmax(probs, axis=1)一样了。
最后再说一下DBN函数中调参数就调下面这段就行了,不用调初始化函数中的了。
dbn = DBN(numpy_rng=numpy_rng, n_ins=4,
              hidden_layers_sizes=[10,10,10,10,10,10],
              n_outs=3)
其实跟神经网络一样设置。输入输出。以iris数据为例,特征是4个,n_ins=4,种类是3个,n_outs=3。
[10,10,10,10,10,10]代表我们用了6层RBM,每层RBM用的10个节点。

相关文章推荐

深度信念网络(DBN)

深度神经网路已经在语音识别,图像识别等领域取得前所未有的成功。本人在多年之前也曾接触过神经网络。本系列文章主要记录自己对深度神经网络的一些学习心得。 1.  ...

Python/scikit-learn机器学习库(SVM支持向量机)

SVMSVM用于分类、回归、异常检测。 优点: 高维空间有效。 维度小于样本数时依然有效。 样本少时表现不好。 分类多分类: SVC、NuSVC、LinearSVC。SVMs决策函数依赖于训练数据中...
  • ae5555
  • ae5555
  • 2015年11月03日 15:08
  • 3238

机器学习算法与Python实践之(四)支持向量机(SVM)实现

机器学习算法与Python实践之(四)支持向量机(SVM)实现zouxy09@qq.comhttp://blog.csdn.net/zouxy09        机器学习算法与Python实践这个系列...
  • zouxy09
  • zouxy09
  • 2013年12月13日 00:12
  • 97114

XGBoost解决多分类问题

XGBoost解决多分类问题 写在前面的话     XGBoost官方给的二分类问题的例子是区别蘑菇有无毒,数据集和代码都可以在xgboost中的demo文件夹对应找到,我是用的Anaco...

模式识别多分类问题求解方法

  • 2015年11月02日 22:53
  • 515KB
  • 下载

(三)Multi-class Classification and Neural Networks[多分类问题和神经网络]

这次打算以代码为主线,适当补充。问题:手写数字识别。 方法一:逻辑回归for c = 1:num_labels initial_theta = zeros(n + 1, 1); % ...
  • hgaolbb
  • hgaolbb
  • 2015年03月27日 16:11
  • 1368

SVM 的推导、特点、优缺点、多分类问题及应用

关于SVM的推导网上有一大堆的资料可以参考,在这里就不在叙述了,重点讲解SVM的其他问题 SVM有如下主要几个特点: (1)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线...

MATLAB实现多分类问题,使用libsvm,1-vs-rest和1-vs-1两种方法代码

最近的项目需要实现多分类,主要的平台是MATLAB+LIBSVM. 如果需求只是实现二分类,那非常简单,可以参见这篇博文多分类存在的主要问题是,LIBSVM主要是为二分类设计的,为了实现多分类就需要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:scikitlearn/theano多分类问题详解
举报原因:
原因补充:

(最多只允许输入30个字)