在分类数据的分析中,我们经常使用逻辑回归来估计二项式结果与一个或多个协变量之间的关系.
我知道这是一种广义线性模型(GLM).在R中,这是glm使用参数的函数实现的family=binomial.另一方面,在分类数据分析中是多项式模型.这些不是GLM吗?并且不能用R glm函数估计它们吗?
(在这篇关于多项Logistic回归的文章中.作者使用外部包mlogit,看起来也过时了)
为什么GLM类限于二分类结果?是因为多类分类可以被视为多个二元分类模型吗?
TensorFlow将每个输入调用到softmax logit.他们继续将softmax的输入/ logits定义为:"非标定日志概率".
维基百科和其他消息来源说,logit是赔率的对数,是sigmoid/logistic函数的倒数.即,如果sigmoid(x)= p(x),则logit(p(x))= log(p(x)/(1-p(x)))= x.
是否存在TensorFlow调用softmax输入"logits"的数学或常规原因?它们不应该被称为"未缩放的日志概率"吗?
也许TensorFlow只想为二元逻辑回归保留相同的变量名称(使用术语logit是有意义的)和分类逻辑回归...
documentation machine-learning logistic-regression tensorflow softmax
请帮助解释weka库中weka.classifiers.functions.Logistic产生的逻辑回归结果.
我使用来自Weka示例的数值数据:
@relation weather
@attribute outlook {sunny, overcast, rainy}
@attribute temperature real
@attribute humidity real
@attribute windy {TRUE, FALSE}
@attribute play {yes, no}
@data
sunny,85,85,FALSE,no
sunny,80,90,TRUE,no
overcast,83,86,FALSE,yes
rainy,70,96,FALSE,yes
rainy,68,80,FALSE,yes
rainy,65,70,TRUE,no
overcast,64,65,TRUE,yes
sunny,72,95,FALSE,no
sunny,69,70,FALSE,yes
rainy,75,80,FALSE,yes
sunny,75,70,TRUE,yes
overcast,72,90,TRUE,yes
overcast,81,75,FALSE,yes
rainy,71,91,TRUE,no
Run Code Online (Sandbox Code Playgroud)
要创建逻辑回归模型,我使用命令:java -cp $ WEKA_INS/weka.jar weka.classifiers.functions.Logistic -t $ WEKA_INS/data/weather.numeric.arff -T $ WEKA_INS/data/weather.numeric.arff - d ./weather.numeric.model.arff
这三个论点意味着:
-t <name of training file> : Sets training file.
-T <name of test file> : Sets test file.
-d <name of output file> : Sets model output …Run Code Online (Sandbox Code Playgroud) 我想解决这个问题.我如何在R中定义在二元逻辑回归中使用的参考水平?那么多项逻辑回归呢?现在我的代码是:
logistic.train.model3 <- glm(class~ x+y+z,
family=binomial(link=logit), data=auth, na.action = na.exclude)
Run Code Online (Sandbox Code Playgroud)
我的响应变量是"YES"和"NO".我想预测某人回答"是"的可能性.
我不想将变量重新编码为0/1.有没有办法告诉模型预测"是"?
谢谢您的帮助.
我在R,python statmodels和sklearn中进行了逻辑回归的一些实验.虽然R和statmodels给出的结果是一致的,但sklearn返回的结果有些不一致.我想了解为什么这些结果不同.据我所知,它可能与木材下使用的优化算法不同.
具体来说,我使用标准Default数据集(在ISL书中使用).以下Python代码将数据读入数据帧Default.
import pandas as pd
# data is available here
Default = pd.read_csv('https://d1pqsl2386xqi9.cloudfront.net/notebooks/Default.csv', index_col=0)
#
Default['default']=Default['default'].map({'No':0, 'Yes':1})
Default['student']=Default['student'].map({'No':0, 'Yes':1})
#
I=Default['default']==0
print("Number of 'default' values :", Default[~I]['balance'].count())
Run Code Online (Sandbox Code Playgroud)
"默认"值的数量:333.
总共有10000个例子,只有333个阳性
我使用以下内容
library("ISLR")
data(Default,package='ISLR')
#write.csv(Default,"default.csv")
glm.out=glm('default~balance+income+student', family=binomial, data=Default)
s=summary(glm.out)
print(s)
#
glm.probs=predict(glm.out,type="response")
glm.probs[1:5]
glm.pred=ifelse(glm.probs>0.5,"Yes","No")
#attach(Default)
t=table(glm.pred,Default$default)
print(t)
score=mean(glm.pred==Default$default)
print(paste("score",score))
Run Code Online (Sandbox Code Playgroud)
结果如下
调用:glm(formula ="default~balance + income + student",family = binomial,data = Default)
Deviance Residuals:Min 1Q Median 3Q Max
-2.4691 -0.1418 -0.0557 -0.0203 3.7383系数:
Run Code Online (Sandbox Code Playgroud)Estimate …
我在使用xgboost运行逻辑回归时遇到问题,可以在下面的示例中进行总结.
让我们假设我有一个非常简单的数据框,有两个预测变量和一个目标变量:
df= pd.DataFrame({'X1' : pd.Series([1,0,0,1]), 'X2' : pd.Series([0,1,1,0]), 'Y' : pd.Series([0,1,1,0], )})
Run Code Online (Sandbox Code Playgroud)
我可以发布图像,因为我是新来的,但我们可以清楚地看到,当X1 = 1且X2 = 0时,Y为0,当X1 = 0且X2 = 1时,Y为1.
我的想法是构建一个输出观察属于每个类的概率的模型,所以如果我运行xgboost试图预测两个新观察(1,0)和(0,1),如下所示:
X = df[['X1','X2']].values
y = df['Y'].values
params = {'objective': 'binary:logistic',
'num_class': 2
}
clf1 = xgb.train(params=params, dtrain=xgb.DMatrix(X, y), num_boost_round=100)
clf1.predict(xgb.DMatrix(test.values))
Run Code Online (Sandbox Code Playgroud)
输出是:
array([[ 0.5, 0.5],
[ 0.5, 0.5]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
我想,这意味着,对于第一次观察,它有50%的可能性属于每个类.
我想知道为什么算法输出一个正确的(1,0)或更接近于如果变量之间的关系是明确的.
仅供参考,我确实尝试过更多数据(为简单起见,我只使用了4行)并且行为几乎相同; 我注意到的是,不仅概率不总和为1,它们通常都非常小:(这个结果在不同的数据集上,与上面的例子无关)
array([[ 0.00356463, 0.00277259],
[ 0.00315137, 0.00268578],
[ 0.00453343, 0.00157113],
Run Code Online (Sandbox Code Playgroud) python regression machine-learning logistic-regression xgboost
我知道逻辑回归是针对多类问题的二元分类和softmax回归.如果我使用相同的数据训练几个逻辑回归模型并将其结果标准化以获得多类分类器而不是使用一个softmax模型,那么会有任何差异吗?我假设结果是一样的.我能说:"所有的多类分类器都是二元分类器的级联结果".(神经网络除外)
algorithm classification machine-learning logistic-regression softmax
我试图用gre,gpa和rank等预测变量来预测admit变量.但是预测精度非常低(0.66).数据集如下所示. https://gist.github.com/abyalias/3de80ab7fb93dcecc565cee21bd9501a
请找到以下代码:
In[73]: data.head(20)
Out[73]:
admit gre gpa rank_2 rank_3 rank_4
0 0 380 3.61 0.0 1.0 0.0
1 1 660 3.67 0.0 1.0 0.0
2 1 800 4.00 0.0 0.0 0.0
3 1 640 3.19 0.0 0.0 1.0
4 0 520 2.93 0.0 0.0 1.0
5 1 760 3.00 1.0 0.0 0.0
6 1 560 2.98 0.0 0.0 0.0
y = data['admit']
x = data[data.columns[1:]]
from sklearn.cross_validation import train_test_split
xtrain,xtest,ytrain,ytest = train_test_split(x,y,random_state=2)
ytrain=np.ravel(ytrain)
#modelling
clf = LogisticRegression(penalty='l2')
clf.fit(xtrain,ytrain) …Run Code Online (Sandbox Code Playgroud) python regression machine-learning scikit-learn logistic-regression
我正在将Keras编写的逻辑回归器的结果与默认的Sklearn Logreg进行比较.我的输入是一维的.我的输出有两个类,我对输出属于类1的概率感兴趣.
我期待结果几乎相同,但它们甚至都不是很接近.
以下是我生成随机数据的方法.请注意,X_train,X_test仍然是向量,我只是使用大写字母,因为我已经习惯了.在这种情况下也不需要缩放.
X = np.linspace(0, 1, 10000)
y = np.random.sample(X.shape)
y = np.where(y<X, 1, 0)
Run Code Online (Sandbox Code Playgroud)
这是在X上绘制的y.在这里做回归不是火箭科学.
我做一个标准的火车测试分裂:
X_train, X_test, y_train, y_test = train_test_split(X, y)
X_train = X_train.reshape(-1,1)
X_test = X_test.reshape(-1,1)
Run Code Online (Sandbox Code Playgroud)
接下来,我训练一个默认的逻辑回归量:
from sklearn.linear_model import LogisticRegression
sk_lr = LogisticRegression()
sk_lr.fit(X_train, y_train)
sklearn_logreg_result = sk_lr.predict_proba(X_test)[:,1]
Run Code Online (Sandbox Code Playgroud)
我在Keras写的一个逻辑回归量:
from keras.models import Sequential
from keras.layers import Dense
keras_lr = Sequential()
keras_lr.add(Dense(1, activation='sigmoid', input_dim=1))
keras_lr.compile(loss='mse', optimizer='sgd', metrics=['accuracy'])
_ = keras_lr.fit(X_train, y_train, verbose=0)
keras_lr_result = keras_lr.predict(X_test)[:,0]
Run Code Online (Sandbox Code Playgroud)
一个手工制作的解决方案:
pearson_corr = np.corrcoef(X_train.reshape(X_train.shape[0],), y_train)[0,1]
b = pearson_corr * …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 python 中实现混合效应逻辑回归。作为比较,我使用的是 R 包中的glmer函数lme4。
我发现该statsmodels模块有一个BinomialBayesMixedGLM应该能够适合这样的模型。但是,我遇到了一些问题:
statsmodels函数的文档并不完全有用或清晰,所以我不完全确定如何正确使用该函数。glmer在 R 中拟合模型时得到的结果。BinomialBayesMixedGLM函数不计算 p 值,因为它是贝叶斯,但我似乎无法弄清楚如何访问参数的完整后验分布。作为测试用例,我使用了可用的泰坦尼克号数据集here。
import os
import pandas as pd
import statsmodels.genmod.bayes_mixed_glm as smgb
titanic = pd.read_csv(os.path.join(os.getcwd(), 'titanic.csv'))
r = {"Pclass": '0 + Pclass'}
mod = smgb.BinomialBayesMixedGLM.from_formula('Survived ~ Age', r, titanic)
fit = mod.fit_map()
fit.summary()
# Type Post. Mean Post. SD SD SD (LB) SD (UB)
# Intercept M 3.1623 0.3616
# Age M …Run Code Online (Sandbox Code Playgroud) python ×4
r ×3
scikit-learn ×3
regression ×2
softmax ×2
algorithm ×1
glm ×1
keras ×1
mixed-models ×1
tensorflow ×1
weka ×1
xgboost ×1