logistic 回归算法
是分类模型不是回归模型
一种常见的分类算法,输出值在0,1之间
是:1
否:0
即找到满足下面条件的最优参数
(0 leq h_{ heta}(x) leq 1)
假设函数的表示方法:
(h_{ heta}(x)=gleft( heta^{T} x
ight))
其中:
(g(z)=frac{1}{1+e^{-z}})
因此,(g(z))带入假设函数之后,假设函数的表示为
(h_{ heta}(x)=frac{1}{1+e^{- heta^{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。因此整个分类问题,就变成了寻找决策边界的问题了。
决策边界:
一个可以进行分类的拟合函数,函数的未知数是( heta),不同的参数决定不同的决策边界
一般是用训练集来自动求解( heta)
那么如何确定逻辑回归的损失函数呢?如果使用均方误差,由于最终的值都是0和1,就会产生震荡,此时是无法进行求导的。
因此需要寻找一个方法,使得代价函数变成凸函数,从而易于求解。
logistic回归的代价函数
(J( heta)=frac{1}{m} sum_{i=1}^{m} operatorname{cost}left(h_{ heta}left(x^{(i)} ight), y^{(i)} ight))
如果这里使用梯度下降法,不能保证能得到全局收敛的值,这个函数就是所谓的非凸函数。因此我们需要找一个不同的代价函数,并且是个凸函数,使得我们可以使用好的算法并找到全局最小值
(operatorname{cost}left(h_{ heta}(x), y ight)=left{egin{aligned}-log left(h_{ heta}(x) ight) & ext { if } y=1 \-log left(1-h_{ heta}(x) ight) & ext { if } y=0 end{aligned} ight.)
y=0 or 1
其简写的形式,也就是化为一项的形式
(egin{aligned} J( heta) &=frac{1}{m} sum_{i=1}^{m} operatorname{cost}left(h_{ heta}left(x^{(i)}
ight), y^{(i)}
ight) \ &=-frac{1}{m}left[sum_{i=1}^{m} y^{(i)} log h_{ heta}left(x^{(i)}
ight)+left(1-y^{(i)}
ight) log left(1-h_{ heta}left(x^{(i)}
ight)
ight)
ight] end{aligned})
这里使用梯度下降法进行求导
梯度下降求导的实质就是反复求导,知道最优解。
Repeat ( heta_{j}:= heta_{j}-frac{alpha}{m} sum_{i=1}^{m}left(h_{ heta}left(x^{(i)}
ight)-y^{(i)}
ight) x_{j}^{(i)})
[
1
]
}
依然是同步更新所有的( heta)值
比梯度下降算法优化一点的算法
对于二分类问题和多分类的问题,就是找到最优的分类器
至于分类器如何确定,还是多见例子
复现代码
# 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