机器学习基础(七)
Logistics回归
原理
Logistics回归是统计学习中的经典分类方法,是一种广义的线性回归模型。它经常被使用于二分类问题的解决上,具有不错的效果。
Logistics回归是在线性回归的基础上,加入了 s i g m o i d sigmoid sigmoid函数,使函数的取值分布在 [ 0 , 1 ] [0,1] [0,1]之间,从而使模型具有分类的效果。
Logistics回归的表达式为:
h
θ
(
x
)
=
g
(
θ
T
X
)
=
1
1
+
e
−
θ
T
x
h_{\theta}(x)=g(\theta^{T}X)=\frac{1}{1+e^{-\theta^{T}x}}
hθ(x)=g(θTX)=1+e−θTx1
所以可以得到
P
(
Y
=
1
∣
x
)
=
h
θ
(
x
)
P
(
Y
=
0
∣
x
)
=
1
−
h
θ
(
x
)
P(Y=1|x)=h_{\theta}(x)\qquad P(Y=0|x)=1-h_{\theta}(x)
P(Y=1∣x)=hθ(x)P(Y=0∣x)=1−hθ(x)
然后就可以得到模型的似然函数为
L
(
θ
)
=
∏
i
=
1
n
(
h
θ
(
x
i
)
)
y
i
(
1
−
h
θ
(
x
i
)
)
1
−
y
i
L(\theta)=\prod^{n}_{i=1}(h_{\theta}(x_{i}))^{y_{i}}(1-h_{\theta}(x_{i}))^{1-y_{i}}
L(θ)=i=1∏n(hθ(xi))yi(1−hθ(xi))1−yi
即当 y i = 0 y_{i}=0 yi=0时函数取 h θ ( x ) h_{\theta}(x) hθ(x),当 y i = 1 y_{i}=1 yi=1时函数取 1 − h θ ( x ) 1-h_{\theta}(x) 1−hθ(x)
然后对似然函数取对数,得到
ln
(
L
(
θ
)
)
=
∑
i
=
1
n
(
y
i
ln
(
h
θ
(
x
i
)
)
+
(
1
−
y
i
)
ln
(
1
−
h
θ
(
x
)
)
)
)
\ln(L(\theta))=\sum^{n}_{i=1}(y_{i}\ln(h_{\theta}(x_{i}))+(1-y_{i})\ln(1-h _{\theta}(x))))
ln(L(θ))=i=1∑n(yiln(hθ(xi))+(1−yi)ln(1−hθ(x))))
然后通过求解模型的极值,就可以得到最优的
θ
\theta
θ值,这也是看作Logistics函数的损失函数,这是所有数据的总损失。但似然函数是取模型最大值时的
θ
\theta
θ值,损失函数是需要求损失最小,所以可以将似然函数取负,然后取平均每个数据的损失,这样可以减少计算量。
c
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
1
n
∑
i
=
1
n
(
y
i
ln
(
h
θ
(
x
i
)
)
+
(
1
−
y
i
)
ln
(
1
−
h
θ
(
x
)
)
)
)
cost(h_{\theta}(x),y)=-\frac{1}{n}\sum^{n}_{i=1}(y_{i}\ln(h_{\theta}(x_{i}))+(1-y_{i})\ln(1-h _{\theta}(x))))
cost(hθ(x),y)=−n1i=1∑n(yiln(hθ(xi))+(1−yi)ln(1−hθ(x))))
代码实现
#导入所需的模块
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
#导入癌症数据
data = load_breast_cancer()
x = pd.DataFrame(data.data,columns=data["feature_names"])
y = data.target
#切分数据集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=1234)
#数据集进行标准化处理
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
#建立logistics回归模型
#模型默认使用l2正则化,C是指定正则化的参数
LR = LogisticRegression(C=60)
LR.fit(x_train,y_train)
#查看模型的准确率
print(LR.score(x_test,y_test))
y_pre = LR.predict(x_test)
#查看模型的召回率
print(classification_report(x_pre,y_test,target_names=data.target_names))