logistic回归模型

logistic 回归算法

是分类模型不是回归模型
一种常见的分类算法,输出值在0,1之间
是:1
否:0
即找到满足下面条件的最优参数
\(0 \leq h_{\theta}(x) \leq 1\)
假设函数的表示方法:
\(h_{\theta}(x)=g\left(\theta^{T} x\right)\)
其中:
\(g(z)=\frac{1}{1+e^{-z}}\)
因此,\(g(z)\)带入假设函数之后,假设函数的表示为
\(h_{\theta}(x)=\frac{1}{1+e^{-\theta^{T} x}}\)

如果我们想要结果总是在0到1之间,那么就可以使用sigmoid函数,它能保证数据在0-1之间。并且越趋近于无穷大,数据越趋近于1。
sigmoid函数==logistic函数
其函数图像如下:

注意到z趋向于负无穷大时,值越接近0;z趋向于正无穷大时,值越接近1。这样就可以使输出值在0到1之间。有了这个假设函数,就可以拟合数据了,根据给定的θ参数值,假设会做出预测

假设一个问题,如果肿瘤是依赖于大小来判断良性恶性,如果超过0.7*平均值,就判断是恶性的,那么平均来算30%的是恶性的,70%是良性的,他们相加总会是100%。再来看看上面的sigmoid的图像,每个点都表示它属于1的概率是x,属于0的概率是1-x。这样一个分类的问题,就变成了曲线值得问题了。

如果想让y=1,即g(z)的值要大于0.5,那么z的值就需要大于0;相反,y=0,就是z的值小于0。因此整个分类问题,就变成了寻找决策边界的问题了。

决策边界:

一个可以进行分类的拟合函数,函数的未知数是\(\theta\),不同的参数决定不同的决策边界

一般是用训练集来自动求解\(\theta\)

那么如何确定逻辑回归的损失函数呢?如果使用均方误差,由于最终的值都是0和1,就会产生震荡,此时是无法进行求导的。

因此需要寻找一个方法,使得代价函数变成凸函数,从而易于求解。

logistic回归的代价函数

\(J(\theta)=\frac{1}{m} \sum_{i=1}^{m} \operatorname{cost}\left(h_{\theta}\left(x^{(i)}\right), y^{(i)}\right)\)

如果这里使用梯度下降法,不能保证能得到全局收敛的值,这个函数就是所谓的非凸函数。因此我们需要找一个不同的代价函数,并且是个凸函数,使得我们可以使用好的算法并找到全局最小值

\(\operatorname{cost}\left(h_{\theta}(x), y\right)=\left\{\begin{aligned}-\log \left(h_{\theta}(x)\right) & \text { if } y=1 \\-\log \left(1-h_{\theta}(x)\right) & \text { if } y=0 \end{aligned}\right.\)

y=0 or 1

其简写的形式,也就是化为一项的形式
\(\begin{aligned} J(\theta) &=\frac{1}{m} \sum_{i=1}^{m} \operatorname{cost}\left(h_{\theta}\left(x^{(i)}\right), y^{(i)}\right) \\ &=-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right] \end{aligned}\)

这里使用梯度下降法进行求导

梯度下降求导的实质就是反复求导,知道最优解。
Repeat \(\theta_{j}:=\theta_{j}-\frac{\alpha}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}\)
[
1
]
}
依然是同步更新所有的\(\theta\)

比梯度下降算法优化一点的算法

jianshu

对于二分类问题和多分类的问题,就是找到最优的分类器
至于分类器如何确定,还是多见例子

复现代码

# Import the necessary modules
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix ,classification_report

# Create training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.4, random_state=42)

# Create the classifier: logreg
logreg = LogisticRegression()

# Fit the classifier to the training data
logreg.fit(X_train,y_train)

# Predict the labels of the test set: y_pred
y_pred = logreg.predict(X_test)

# Compute and print the confusion matrix and classification report
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

#<script.py> output:
    [[176  30]
     [ 35  67]]
                 precision    recall  f1-score   support
    
              0       0.83      0.85      0.84       206
              1       0.69      0.66      0.67       102
    
    avg / total       0.79      0.79      0.79       308
posted @ 2020-01-24 20:37  高文星星  阅读(1011)  评论(0编辑  收藏  举报