本文所有代码及数据可下载。

Scikit Learn 篇:Light 版

scikit learn内置了逻辑回归,对于小规模的应用较为简单,一般使用如下代码即可

from sklearn.linear_model.logistic import LogisticRegression

classifier = LogisticRegression()

classifier.fit(X_train, y_train)

predictions = classifier.predict(X_test)

如果要根据LR的系数及截距手动计算概率,可以如下操作:

def softmax(x):

e_x = np.exp(x - np.max(x)) # 防止exp()数值溢出

return e_x / e_x.sum(axis=0)

pred = [np.argmax(softmax(np.dot(classifier.coef_, X_test[i,:]) + classifier.intercept_)) for i in range(len(X_test))]

print np.sum(pred != predictions) # 检查是否存在差异

完整代码LR_sklearn_light.py可下载。

Scikit Learn 篇:Pro 版

当数据量较大时,例如量级:1千万条数据,1000个特征维度。此时直接使用LogisticRegression()的训练速度较慢,并且要求把所有数据预先加载到内存中,这有可能导致内存不足的问题。解决办法是采用mini batch的形式,每读取一个batch的数据便进行一次训练。

通常从HDFS上取得的数据都会以多个分片的形式存在,以最常用的csv文件格式为例。首先我们使用glob包生成所有数据文件的文件名list,训练集数据文件名是train_part0.csv这样的,使用 * 可以进行任意字符匹配。

filenames = sorted(glob.glob("./TrainData/train*"))

再遍历每一个文件,每次读取chunksize行的数据块作为一个batch,对于每一个batch,调用sklearn中分类器的partial_fit()方法在当前batch上进行梯度下降,直到所有数据都被使用过或达到设置的最大训练步数。

filenames = sorted(glob.glob("./TrainData/train*"))

MaxIterNum = 100

count = 0

for c, filename in enumerate(filenames):

TrainDF = pd.read_csv(filename, header = None, chunksize = 10)

for Batch in TrainDF:

count += 1

print count

y_train = np.array(Batch.iloc[:,0])

X_train = np.array(Batch.iloc[:,1:])

st1 = time.time()

classifier.partial_fit(X_train,y_train, classes=np.array([0, 1, 2]))

ed1 = time.time()

st2 = time.time()

predictions = classifier.predict(X_train)

acc = metrics.accuracy_score(y_train,predictions)

ed2 = time.time()

print ed1-st1, ed2-st2, acc

if count == MaxIterNum:

break

if count == MaxIterNum:

break

对于测试数据,同样可以采用这种batch的读取方法,并拼接起来统一进行测试,调用sklearn的accuracy_score()函数得到准确率,调用confusion_matrix()得到混淆矩阵。

X_test = np.zeros([100, np.shape(X_train)[1]])

y_test = np.zeros(100)

TestSampleNum = 0

filenames = sorted(glob.glob("./TestData/test*"))

MaxIterNum = 100

count = 0

for c, filename in enumerate(filenames):

TestDF = pd.read_csv(filename, header = None, chunksize = 10)

for Batch in TestDF:

count += 1

print count

y_test[TestSampleNum:TestSampleNum+np.shape(Batch)[0]] = np.array(Batch.iloc[:,0])

X_test[TestSampleNum:TestSampleNum+np.shape(Batch)[0],:] = np.array(Batch.iloc[:,1:])

TestSampleNum = TestSampleNum+np.shape(Batch)[0]

if count == MaxIterNum:

break

if count == MaxIterNum:

break

X_test = X_test[0:TestSampleNum,:]

y_test = y_test[0:TestSampleNum]

st1 = time.time()

predictions = classifier.predict(X_test)

acc = accuracy_score(y_test,predictions)

ed1 = time.time()

print ed1-st1, acc

A = confusion_matrix(y_test, predictions)

print A

完整代码LR_sklearn_pro.py可下载。

Tensorflow 篇

tensorflow主要用于处理较大数据量的情况。第一步是使用inputPipeLine将数据读入过程与训练过程并行。这里对训练集和测试集分别建立读取管线,注意训练集的numEpochs与测试集是不同的,这里允许重复训练多次:

def readMyFileFormat(fileNameQueue):

reader = tf.TextLineReader()

key, value = reader.read(fileNameQueue)

record_defaults = [[0]] + [[0.0]] * 4

user = tf.decode_csv(value, record_defaults=record_defaults)

userlabel = user[0]

userlabel01 = tf.cast(tf.one_hot(userlabel,ClassNum,1,0), tf.float32)

userfeature = user[1:]

return userlabel01, userfeature

def inputPipeLine_batch(fileNames, batchSize, numEpochs = None):

fileNameQueue = tf.train.string_input_producer(fileNames, num_epochs = numEpochs, shuffle = False )

example = readMyFileFormat(fileNameQueue)

min_after_dequeue = 10

capacity = min_after_dequeue + 3 * batch_size_train

YBatch, XBatch = tf.train.batch(

example, batch_size = batchSize,

capacity = capacity)

return YBatch, XBatch

filenames = tf.train.match_filenames_once(DataDir)

YBatch, XBatch = inputPipeLine_batch(filenames, batchSize = batch_size, numEpochs = 20)

pfilenames = tf.train.match_filenames_once(pDataDir)

pYBatch, pXBatch = inputPipeLine_batch(pfilenames, batchSize = batch_size, numEpochs = 1)

然后构建网络:

# LR

X_LR = tf.placeholder(tf.float32, [None, FeatureSize])

Y_LR = tf.placeholder(tf.float32, [None, ClassNum])

W_LR = tf.Variable(tf.truncated_normal([FeatureSize, ClassNum], stddev=0.1), dtype=tf.float32)

bias_LR = tf.Variable(tf.constant(0.1,shape=[ClassNum]), dtype=tf.float32)

Ypred_LR = tf.matmul(X_LR, W_LR) + bias_LR

Ypred_prob = tf.nn.softmax(Ypred_LR)

cost = -tf.reduce_mean(Y_LR*tf.log(Ypred_prob))

optimizer = tf.train.AdamOptimizer(lr).minimize(cost)

使用mini batch的梯度下降方法训练网络,并用TrainBatchNum控制最大训练步数:

# 训练

try:

for i in range(TrainBatchNum):

print i

y, x = sess.run([YBatch, XBatch], feed_dict={batch_size: batch_size_train})

flag, c = sess.run([optimizer, cost], feed_dict={X_LR: x, Y_LR: y})

print c

except tf.errors.OutOfRangeError:

print 'Done Train'

分批读取测试集后再拼接起来统一评估:

# 测试

Y = np.array([0, 0, 0])

Pred = np.array([0, 0, 0])

try:

i = 0

while True:

print i

i = i + 1

y, x = sess.run([pYBatch, pXBatch], feed_dict={batch_size: batch_size_test})

pred = sess.run(Ypred_prob, feed_dict={X_LR: x, Y_LR: y})

Pred = np.vstack([Pred,pred])

Y = np.vstack([Y,y])

except tf.errors.OutOfRangeError:

print 'Done Test'

Y = Y[1:]

Pred = Pred[1:]

acc = accuracy_score(np.argmax(Y, axis = 1),np.argmax(Pred, axis = 1))

print acc

A = confusion_matrix(np.argmax(Y, axis = 1),np.argmax(Pred, axis = 1))

print A

完整代码LR_tf.py可下载。

python 多分类逻辑回归_机器学习实践:多分类逻辑回归(softmax回归)的sklearn实现和tensorflow实现...相关推荐

  1. 正确率能很好的评估分类算法吗_机器学习算法:分类知识超全总结!

    关注上方"Python数据科学",选择星标,关键时间,第一时间送达! ☞500g+超全学习资源免费领取  Datawhale,译者:张峰本文将介绍机器学习算法中非常重要的知识-分类 ...

  2. python支持向量机回归_机器学习实战-支持向量机原理、Python实现和可视化(分类)...

    支持向量机(SVM)广泛应用于模式分类和非线性回归领域. SVM算法的原始形式由Vladimir N.Vapnik和Alexey Ya提出.自从那以后,SVM已经被巨大地改变以成功地用于许多现实世界问 ...

  3. 机器学习学习吴恩达逻辑回归_机器学习基础:逻辑回归

    机器学习学习吴恩达逻辑回归 In the previous stories, I had given an explanation of the program for implementation ...

  4. python可以开发驱动吗_Python机器学习实践:测试驱动的开发方法

    Python机器学习实践:测试驱动的开发方法 作者:(美)马修·柯克(Matthew Kirk) 著 出版日期:2017年10月 文件大小:30.91M 支持设备: ¥40.00在线试读 适用客户端: ...

  5. python分类算法报告_Python机器学习(1)——决策树分类算法

    1.决策树算法 决策树用树形结构对样本的属性进行分类,是最直观的分类算法,而且也可以用于回归.不过对于一些特殊的逻辑分类会有困难.典型的如异或(XOR)逻辑,决策树并不擅长解决此类问题. 决策树的构建 ...

  6. 正确率能很好的评估分类算法吗_机器学习算法优缺点对比及选择(汇总篇)

    转自:机器学习与统计学 本文的目的,是务实.简洁地盘点一番当前机器学习算法.文中内容结合了个人在查阅资料过程中收集到的前人总结,同时添加了部分自身总结,在这里,依据实际使用中的经验,将对此模型优缺点及 ...

  7. python 分类变量编码_深度学习编码分类变量的3种方法——AIU人工智能学院

    :数据科学.人工智能从业者的在线大学. 数据科学(Python/R/Julia) 作者 | CDA数据分析师 像Keras中的机器学习和深度学习模型一样,要求所有输入和输出变量均为数字. 这意味着,如 ...

  8. python 随机森林调参_Python机器学习实践:随机森林算法训练及调参-附代码

    原标题:Python机器学习实践:随机森林算法训练及调参-附代码 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 ...

  9. 机器学习算法_机器学习算法中分类知识总结!

    ↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习,不错过Datawhale干货 译者:张峰,Datawhale成员 本文将介绍机器学习算法中非常重要的知识- ...

最新文章

  1. 《深入java虚拟机》读书笔记类加载
  2. 产品经理利器之axure rp
  3. Hive表联合查询语句参考
  4. Mysql 提示:Communication link failure
  5. 异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结
  6. Struts第一个案例搭建
  7. canvas合成图片 圣诞节新技能戴帽
  8. python-文件和流
  9. Centos-检查文件系统并尝试修复-fsck
  10. 牛顿下山法python_一文看懂牛顿法(附Python实现)
  11. 【Vue2.0】— 插件(十六)
  12. faker假数据php,Faker首页、文档和下载 - 生成假数据的 PHP 库
  13. ftp服务器文件端口,ftp服务器端口用哪个文件
  14. 杭电复试笔记第七天--最终篇
  15. E WORD 0410
  16. REC Solar推出黑色多晶半切片PERC组件,已进入量产化
  17. vue项目-jQuery中Nicescroll滚动条插件的用法
  18. Foobar2000使用学习
  19. 虚拟机DEDECMS织梦建站
  20. 【车间调度】免疫遗传算法求解多目标生产调度问题【含Matlab源码 710期】

热门文章

  1. python non utf 8_Python 一个关于字符编码的诡异问题(Non-UTF-8 code starting with '\xe5')...
  2. 疑似高能粒子射线导致服务程序异常
  3. linux分区dh满了,python 在linux下能过top,和dh命令获得cpu,内存,以及硬盘信息 - Sprite...
  4. Linux进程和计划任务管理
  5. html绘制头像原样教程,CSS实例教程:创意CSS3头像展示教程
  6. android 多个标签页,Android一个标签页的实现
  7. android文件选择器_Android存储空间的最佳实践(上)
  8. firewall-cmd命令管理防火墙
  9. _Linux系统编程—信号集操作函数
  10. HTML中的5种空格表示,HTML中的5种空格各表示的意义