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\)值
比梯度下降算法优化一点的算法
对于二分类问题和多分类的问题,就是找到最优的分类器
至于分类器如何确定,还是多见例子
复现代码
# 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