python 多分类逻辑回归_机器学习实践:多分类逻辑回归(softmax回归)的sklearn实现和tensorflow实现...
本文所有代码及数据可下载。
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实现...相关推荐
- 正确率能很好的评估分类算法吗_机器学习算法:分类知识超全总结!
关注上方"Python数据科学",选择星标,关键时间,第一时间送达! ☞500g+超全学习资源免费领取 Datawhale,译者:张峰本文将介绍机器学习算法中非常重要的知识-分类 ...
- python支持向量机回归_机器学习实战-支持向量机原理、Python实现和可视化(分类)...
支持向量机(SVM)广泛应用于模式分类和非线性回归领域. SVM算法的原始形式由Vladimir N.Vapnik和Alexey Ya提出.自从那以后,SVM已经被巨大地改变以成功地用于许多现实世界问 ...
- 机器学习学习吴恩达逻辑回归_机器学习基础:逻辑回归
机器学习学习吴恩达逻辑回归 In the previous stories, I had given an explanation of the program for implementation ...
- python可以开发驱动吗_Python机器学习实践:测试驱动的开发方法
Python机器学习实践:测试驱动的开发方法 作者:(美)马修·柯克(Matthew Kirk) 著 出版日期:2017年10月 文件大小:30.91M 支持设备: ¥40.00在线试读 适用客户端: ...
- python分类算法报告_Python机器学习(1)——决策树分类算法
1.决策树算法 决策树用树形结构对样本的属性进行分类,是最直观的分类算法,而且也可以用于回归.不过对于一些特殊的逻辑分类会有困难.典型的如异或(XOR)逻辑,决策树并不擅长解决此类问题. 决策树的构建 ...
- 正确率能很好的评估分类算法吗_机器学习算法优缺点对比及选择(汇总篇)
转自:机器学习与统计学 本文的目的,是务实.简洁地盘点一番当前机器学习算法.文中内容结合了个人在查阅资料过程中收集到的前人总结,同时添加了部分自身总结,在这里,依据实际使用中的经验,将对此模型优缺点及 ...
- python 分类变量编码_深度学习编码分类变量的3种方法——AIU人工智能学院
:数据科学.人工智能从业者的在线大学. 数据科学(Python/R/Julia) 作者 | CDA数据分析师 像Keras中的机器学习和深度学习模型一样,要求所有输入和输出变量均为数字. 这意味着,如 ...
- python 随机森林调参_Python机器学习实践:随机森林算法训练及调参-附代码
原标题:Python机器学习实践:随机森林算法训练及调参-附代码 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 ...
- 机器学习算法_机器学习算法中分类知识总结!
↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习,不错过Datawhale干货 译者:张峰,Datawhale成员 本文将介绍机器学习算法中非常重要的知识- ...
最新文章
- 《深入java虚拟机》读书笔记类加载
- 产品经理利器之axure rp
- Hive表联合查询语句参考
- Mysql 提示:Communication link failure
- 异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结
- Struts第一个案例搭建
- canvas合成图片 圣诞节新技能戴帽
- python-文件和流
- Centos-检查文件系统并尝试修复-fsck
- 牛顿下山法python_一文看懂牛顿法(附Python实现)
- 【Vue2.0】— 插件(十六)
- faker假数据php,Faker首页、文档和下载 - 生成假数据的 PHP 库
- ftp服务器文件端口,ftp服务器端口用哪个文件
- 杭电复试笔记第七天--最终篇
- E WORD 0410
- REC Solar推出黑色多晶半切片PERC组件,已进入量产化
- vue项目-jQuery中Nicescroll滚动条插件的用法
- Foobar2000使用学习
- 虚拟机DEDECMS织梦建站
- 【车间调度】免疫遗传算法求解多目标生产调度问题【含Matlab源码 710期】
热门文章
- python non utf 8_Python 一个关于字符编码的诡异问题(Non-UTF-8 code starting with '\xe5')...
- 疑似高能粒子射线导致服务程序异常
- linux分区dh满了,python 在linux下能过top,和dh命令获得cpu,内存,以及硬盘信息 - Sprite...
- Linux进程和计划任务管理
- html绘制头像原样教程,CSS实例教程:创意CSS3头像展示教程
- android 多个标签页,Android一个标签页的实现
- android文件选择器_Android存储空间的最佳实践(上)
- firewall-cmd命令管理防火墙
- _Linux系统编程—信号集操作函数
- HTML中的5种空格表示,HTML中的5种空格各表示的意义