logistic regression(3)

  自己用底层语言去实现一下基本算法,并没有想象中那么容易,其中为了保证最终模型得到结果的正确性,在构建迭代算法时候真是一点不能马虎,尽管最终测试表面上通过了,这很大程度建立在iris数据集比较特殊的基础上,尝试接入同事从验证码当中提取的数据集来对验证码进行识别(该数据集也很规整),但是怎么训练得到的参数都不经人意,无奈。。。(有种强烈的挫败感。。。)
  回过头来还是膜拜 sklearn 库,自身的计算机思维和编程基本功还是有待加强。同事采用sklearn 库各种分类算法都能得到满意的结果,也难怪 python 在机器学习占主流地位,尽管个人算是 R 忠实用户,但是站在风口猪都能飞呢,还是要紧跟时代的脚步。

  还是逻辑回归这个最基本的算法,尝试采用 sklearn 库中提供的算法和采用 tensorflow 计算框架构建一个做比较。还是选取我最爱的iris数据集为例。

# load Module
import numpy as np
import tensorflow as tf
from sklearn.datasets import load_iris
from sklearn.metrics import confusion_matrix  
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# data deal
iris = load_iris()
# 因为是二分类,所以只选取两个类别的数据
X_iris = iris.data[0:100, :]
y_iris = iris.target[0:100]
X_train, X_test, y_train, y_test = train_test_split(X_iris, y_iris, test_size=0.2)
  • sklearn LogisticRegression
LR = LogisticRegression()
LR.fit(X_train, y_train)
y_pred = LR.predict(X_test)
print confusion_matrix(y_test, y_pred)  
# array([[ 9,  0],
#        [ 0, 11]])

  没错,数据处理好,三行代码完成所有任务,从混淆矩阵来看,准确率还是很棒,预测完全正确!

  • tensorflow sigmoid model
# 训练x占位符和训练y占位符
x = tf.placeholder("float", [None, 4])
y_ = tf.placeholder("float", [None, 1])
# 初始化权重和偏置
W = tf.Variable(tf.zeros([4, 1]))
b = tf.Variable(tf.zeros([1]))
# 构建sigmoid 逻辑回归模型
y = tf.sigmoid(tf.matmul(x, W) + b)
# 定义损失函数
cross_entropy = - tf.reduce_sum(y_ * tf.log(y) + (1-y_) * tf.log(1-y)) / float(80)
# 梯度下降
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(cross_entropy)
# 定义初始化
init = tf.initialize_all_variables()
# 启动图
with tf.Session() as sess:
    sess.run(init)
    # 这里采用批量梯度下降,因为数据量较小,我选取了整个样本集
    for i in range(1000):
        sess.run(train_step, feed_dict={x: X_train, y_: y_train.reshape(-1, 1)})
        pred = sess.run(y, feed_dict={x: X_test})
# Accuracy
result = (np.where(pred >= 0.5, 1, 0).T[0] == y_test)
LR_Accuracy = len(result[result == True]) / float(len(result))
LR_Accuracy
# 1.0

  最终代码结果输出1.0,1.0什么意思?当然是准确率100%咯。在实际场景中准确率这个指标没有在实验场景下具有那么重要的意义。不过机器学习模型本身不同于传统统计模型的地方就在于它相对关心模型的准确率而非可解释性。但并不能说明机器学习模型无可解释性,只是相对复杂的模型较难解释而已。

  • tensorflow softmax model
# 选取整个数据集来进行多分类
X_iris_ = iris.data
y_iris_ = OneHotEncoder(sparse = False).fit_transform(iris.target.reshape((len(X_iris_),1)))
X_train, X_test, y_train, y_test = train_test_split(X_iris_, y_iris_, test_size=0.2)
# 训练x占位符和训练y占位符
x = tf.placeholder("float", [None, 4])
y_ = tf.placeholder("float", [None, 3])
# 初始化权重和偏置
W = tf.Variable(tf.zeros([4, 3]))
b = tf.Variable(tf.zeros([3]))
# 构建sigmoid 逻辑回归模型
y = tf.nn.softmax(tf.matmul(x, W) + b)
# 定义损失函数
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
# 梯度下降
train_step = tf.train.GradientDescentOptimizer(0.0001).minimize(cross_entropy)
# 构建预测图
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float64"))
# 初始化
init = tf.initialize_all_variables()
# 启动图
with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        sess.run(train_step, feed_dict={x: X_train, y_: y_train})
    Accuracy = sess.run(accuracy, feed_dict={x: X_test, y_: y_test})
Accuracy
# 1.0

  softmax是sigmoid的拓展,这里将学习速率从0.001调整至0.0001才保存模型最终输出到达100%的准确率。这里softmax回归的损失函数与sigmoid回归不同,事实上这也是不同模型之间差异的一个重要方面。
  而事实上sklearn 库LogisticRegression无需任何调参数,当响应变量为大于两个类别时,它自动采取多分类学习的策略,不得佩服开发者设想全面,可能这是比较基本的需求,但是自己去实现一遍才懂这样的通用泛化程序真不是一般人能完成的。

  带点个人色彩的想法,对算法的学习还是以tensorflow作为工具,这样可以充分体会模型设计和优化算法之间的紧密性,同时能感受到不同模型间最本质的差异。有能力最好可以自己动手来实现算法,不过这个太费时间。追求效率的话,还是sklearn神器靠谱。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值