我想解决这个问题.我如何在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 …
我正在尝试使用正规化的LR,在matlab中使用这个公式很简单:
成本函数:
J(theta) = 1/m*sum((-y_i)*log(h(x_i)-(1-y_i)*log(1-h(x_i))))+(lambda/2*m)*sum(theta_j)
Run Code Online (Sandbox Code Playgroud)
渐变:
?J(theta)/?theta_0 = [(1/m)*(sum((h(x_i)-y_i)*x_j)] if j=0
?j(theta)/?theta_n = [(1/m)*(sum((h(x_i)-y_i)*x_j)]+(lambda/m)*(theta_j) if j>1
Run Code Online (Sandbox Code Playgroud)
这不是matlab代码只是公式.
到目前为止我已经这样做了:
function [J, grad] = costFunctionReg(theta, X, y, lambda)
J = 0;
grad = zeros(size(theta));
temp_theta = [];
%cost function
%get the regularization term
for jj = 2:length(theta)
temp_theta(jj) = theta(jj)^2;
end
theta_reg = lambda/(2*m)*sum(temp_theta);
temp_sum =[];
%for the sum in the cost function
for ii =1:m
temp_sum(ii) = -y(ii)*log(sigmoid(theta'*X(ii,:)'))-(1-y(ii))*log(1-sigmoid(theta'*X(ii,:)'));
end
tempo = sum(temp_sum);
J = (1/m)*tempo+theta_reg;
%regulatization
%theta 0
reg_theta0 = 0; …Run Code Online (Sandbox Code Playgroud) Gradient Descent存在局部最小值的问题.我们需要运行梯度下降指数时间来找到全局最小值.
任何人都能告诉我梯度下降的任何替代方案的优缺点.
谢谢.
machine-learning neural-network gradient-descent logistic-regression
我试图用SKLearn做一个LR,用于一个相当大的数据集,其中有600个虚拟数据集,只有很少的区间变量(我的数据集中有300 K行),结果混淆矩阵看起来很可疑.我想检查返回系数和ANOVA的重要性,但我找不到如何访问它.有可能吗?对于包含大量虚拟变量的数据,最佳策略是什么?非常感谢!
我正在使用 Anaconda 并且我正在尝试逻辑回归。加载训练数据集并执行回归后。然后我收到以下警告消息。
train_cols = data.columns[1:]
logit = sm.Logit(data['harmful'], data[train_cols])
result = logit.fit()
Warning: Maximum number of iterations has been exceeded.
Current function value: 0.000004
Iterations: 35
C:\Users\dell\Anaconda\lib\site-packages\statsmodels\base\model.py:466: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals"Check mle_retvals", ConvergenceWarning)
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此警告以及如何解决此问题?谢谢!
我想了解如何使用分类数据为特征sklearn.linear_model的LogisticRegression.
我理解当然我需要编码它.
我不明白的是如何将编码特征传递给Logistic回归,以便将其作为分类特征处理,而不是解释编码作为标准可量化特征时获得的int值.
(不太重要)有人可以解释两者的区别preprocessing.LabelEncoder(),DictVectorizer.vocabulary或者只是一个简单的字典编码自己分类数据?Alex A.的评论涉及这个主题,但不是很深刻.
尤其是第一个!
python regression data-modeling scikit-learn logistic-regression
我有一个大型数据集,并且喜欢为每个城市拟合不同的逻辑回归,这是我数据中的一列.以下70/30拆分工作未考虑City组.
indexes <- sample(1:nrow(data), size = 0.7*nrow(data))
train <- data[indexes,]
test <- data[-indexes,]
Run Code Online (Sandbox Code Playgroud)
但这并不能保证每个城市的70/30分割.
假设我有城市A和城市B,城市A有100行,城市B有900行,共1000行.用上面的代码拆分数据将给我700列火车和300行测试数据,但它不能保证我在城市A有70行,在列车数据中有城市B有630行.我怎么做?
一旦我将每个城市的训练数据分成70/30时尚,我将为每个城市运行逻辑回归(我知道如果我有列车数据怎么做)
我们将sklearn从旧的0.13-git升级到0.14.1,并发现我们的逻辑回归分类器的性能发生了很大变化.用相同数据训练的两个分类器具有不同的系数,因此经常给出不同的分类结果.
作为实验,我使用5个数据点(高维)训练LR分类器,结果如下:
0.13的git:
clf.fit(data_test.data, y)
LogisticRegression(C=10, class_weight='auto', dual=False, fit_intercept=True,
intercept_scaling=1, penalty='l2', tol=0.0001)
np.sort(clf.coef_)
array([[-0.12442518, -0.11137502, -0.11137502, ..., 0.05428562,
0.07329358, 0.08178794]])
Run Code Online (Sandbox Code Playgroud)
0.14.1:
clf1.fit(data_test.data, y)
LogisticRegression(C=10, class_weight='auto', dual=False, fit_intercept=True,
intercept_scaling=1, penalty='l2', random_state=None, tol=0.0001)
np.sort(clf1.coef_)
array([[-0.11702073, -0.10505662, -0.10505662, ..., 0.05630517,
0.07651478, 0.08534311]])
Run Code Online (Sandbox Code Playgroud)
我会说差异很大,在10 ^( - 2)的范围内.显然,我在这里使用的数据并不理想,因为特征的维度远大于条目的数量.但是,实际情况也是如此.它与功能选择有关吗?如何使结果与以前一样?我理解新结果不一定比以前更差,但现在重点是尽可能使它们保持一致.谢谢.
我试图预测一个标签在每一行DataFrame,但不使用LinearRegressionModel的transform方法,由于醉翁之意不在酒,而不是我试图通过使用经典公式手动计算它1 / (1 + e^(-h?(x))),请注意,我是从复制的代码Apache Spark的存储库并将几乎所有东西从private对象复制BLAS到它的公共版本中.PD:我没有使用任何regParam,我只是安装了模型.
//Notice that I had to obtain intercept, and coefficients from my model
val intercept = model.intercept
val coefficients = model.coefficients
val margin: Vector => Double = (features) => {
BLAS.dot(features, coefficients) + intercept
}
val score: Vector => Double = (features) => {
val m = margin(features)
1.0 / (1.0 + math.exp(-m))
}
Run Code Online (Sandbox Code Playgroud)
在定义了这些函数并获得模型的参数后,我创建了一个UDF来计算预测(它接收与a相同的特征 …
python ×4
scikit-learn ×4
r ×3
anaconda ×1
anova ×1
apache-spark ×1
dummy-data ×1
matlab ×1
regression ×1
regularized ×1
scala ×1
split ×1
statsmodels ×1
warnings ×1