Softmax逻辑回归:scikit学习和TensorFlow的不同表现

Softmax逻辑回归:scikit学习和TensorFlow的不同表现,tensorflow,machine-learning,scikit-learn,logistic-regression,softmax,Tensorflow,Machine Learning,Scikit Learn,Logistic Regression,Softmax,我试图学习一些数据的简单线性softmax模型。scikit learn中的LogisticRegression似乎工作得很好,现在我正尝试将代码移植到TensorFlow,但我没有获得相同的性能,但有点糟糕。我知道结果不会完全相同(scikit learn具有正则化参数等),但这太遥远了 total=pd.read\u feather('testfile.feather')) 标签=总计['labels'] 特征=总[['f1',f2']] 打印(标签.形状) 打印(特征.形状) 分类器=线性

我试图学习一些数据的简单线性softmax模型。scikit learn中的LogisticRegression似乎工作得很好,现在我正尝试将代码移植到TensorFlow,但我没有获得相同的性能,但有点糟糕。我知道结果不会完全相同(scikit learn具有正则化参数等),但这太遥远了

total=pd.read\u feather('testfile.feather'))
标签=总计['labels']
特征=总[['f1',f2']]
打印(标签.形状)
打印(特征.形状)
分类器=线性模型。逻辑回归(C=1e5,解算器='newton-cg',多元类='多项式')
分类器.fit(特性、标签)
pred_labels=分类器。预测(特征)
打印(“SCI-KIT学习结果:”)
打印('\t准确度:',分类器.score(特征,标签))
打印('\t精度:',精度分数(标签,pred标签,average='macro'))
打印(“\tRecall:”,回忆分数(标签,pred标签,average='macro'))
打印('\tF1:',f1_分数(标签,pred_标签,average='macro'))
#现在尝试使用tensorflow进行softmax回归
打印(“\n\n流结果:”)
##默认情况下,OneHotEncoder类将返回更有效的稀疏编码。
这可能不适合深度学习lib库等应用程序。
##在本例中,我们通过设置sparse=False参数禁用了稀疏返回类型。
enc=OneHotEncoder(稀疏=False)
enc.fit(labels.values.reformate(len(labels),1))#除二维数据作为输入外,编码器还需要进行整形
labels\u one\u hot=enc.transform(labels.values.reformate(len(labels),1))
#tf图形输入
x=tf.placeholder(tf.float32,[None,2])#2个输入特征
y=tf.placeholder(tf.float32,[None,5])#5个输出类
#设置模型权重
W=tf.变量(tf.零([2,5]))
b=tf.变量(tf.零([5]))
#构造模型
pred=tf.nn.softmax(tf.matmul(x,W)+b)#softmax
clas=tf.argmax(pred,轴=1)
#利用交叉熵最小化误差
成本=tf.reduce\u均值(-tf.reduce\u和(y*tf.log(pred),reduce\u指数=1))
#梯度下降
优化器=tf.train.GradientDescentOptimizer(0.01)。最小化(成本)
#初始化变量(即分配其默认值)
init=tf.global_variables_initializer()
#开始训练
使用tf.Session()作为sess:
#运行初始值设定项
sess.run(初始化)
#训练周期
对于范围内的历元(1000):
#运行优化op(backprop)和成本op(以获取损失值)
_,c=sess.run([optimizer,cost],feed\u dict={x:features,y:labels\u one\u hot})
#测试模型
正确的预测=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
class_out=clas.eval({x:features})
#计算精度
准确度=tf.reduce_平均值(tf.cast(正确的预测,tf.float32))
打印(“\t准确度:”,accurity.eval({x:features,y:labels\u one\u hot}))
打印('\t精度:',精度分数(标签,类输出,平均值='宏'))
打印('\t调用:',调用分数(标签,类输出,平均值='宏'))
打印('\tF1:',f1_分数(标签,类输出,平均值='宏'))
这段代码的输出是

(1681,)
(1681, 2)
SCI-KIT学习结果:
准确度:0.822129684711
精度:0.837883361162
召回:0.78452252208
F1:0.806251963817
TENSORFLOW结果:
准确度:0.694825
精度:0.735883666192
召回:0.649145125846
F1:0.678045562185
我检查了一次热编码的结果和数据,但我不知道为什么TF的结果更糟糕


任何建议都将非常感谢。

问题被证明是愚蠢的,我只需要更多的时间,更小的学习率(为了提高效率,我求助于AdamOptimizer,结果现在是相等的,尽管TF的实现要慢得多)

(1681,)
(1681, 2)
SCI-KITLEARN RESULTS:
    Accuracy: 0.822129684711
    Precision: 0.837883361162
    Recall: 0.784522522208
    F1: 0.806251963817

TENSORFLOW RESULTS:
    Accuracy: 0.82213
    Precision: 0.837883361162
    Recall: 0.784522522208
    F1: 0.806251963817

至少有一个很大的区别:
newton\u cg
在做线搜索,你的tensorflow代码没有,Maxim的观点很有趣,我没有想到。我有点被你的损失函数搞糊涂了,我知道它不是交叉熵的形式。
−(y)对数(pred)+(1−y) 日志(1)−pred))
我想你只定义了一半的交叉熵损失函数。或者我只是不熟悉这种形式?只是为了确定我会使用
tf.nn.softmax\u cross\u entropy\u和\u logits
来验证东西。@David Parks嗯,我使用了与TensorFlow()的softmax教程中使用的相同的损失函数。我确实注意到,降低学习率和增加历次给了我同样的结果!@David Parks tf.softmax\u cross\u entropy\u with_logits给出了与上面描述的结果相同的结果。不过,根据文档,后者更为稳健