逻辑回归|机器学习|分类算法
Posted 桃陉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑回归|机器学习|分类算法相关的知识,希望对你有一定的参考价值。
1.逻辑回归
1.1逻辑回归原理
∙
\\bullet
∙ 逻辑回归
又叫对数几率回归,是一种对数几率模型,可以求解二分类
问题。
∙
\\bullet
∙ 之前我们学习过线性回归模型,带入模型后每一个点都有一个对应的实数值,范围为整个实数域;但是由于逻辑回归是利用回归方法解决二分类问题,所以求得的结果只能有两个值,在这里我们使用概率
来对这两类进行描述:
y
^
=
{
0
p
^
<
0.5
1
p
^
>
0.5
\\color{Violet}\\begin{matrix} \\hat y & = & \\left\\{\\begin{matrix} 0 & \\hat p<0.5 \\\\ 1 & \\hat p>0.5 \\end{matrix}\\right. & \\end{matrix}
y^={01p^<0.5p^>0.5
在上述式子中, y ^ \\color{Red}\\hat y y^ 代表最终输出的标签值,它只有两个取值,当概率 p ^ \\color{Red}\\hat p p^ 大于0.5时取值1;当概率 p ^ \\color{Red}\\hat p p^ 小于0.5时取值为0;
∙ \\bullet ∙ 所以我们现在的问题就是如何把输出限制在(0,1)之间,通过线性回归的学习我们知道在线性回归中输出结果为: y ^ = W T x + b \\color {Violet}\\hat y = W^{T}x+b y^=WTx+b
那么我们现在需要通过另外一个 σ \\sigma σ函数将其进行压缩,即 y ^ = σ ( W T + b ) \\color{Violet}\\hat y=\\sigma(W^{T}+b) y^=σ(WT+b),下面我们继续介绍 σ \\color{Red}\\sigma σ 函数。
1.2sigmoid函数
上面我们提到的
σ
\\color{Red}\\sigma
σ 函数表达式如下:
σ
(
t
)
=
1
1
+
e
−
t
\\color{Violet}\\sigma (t) =\\frac{1}{1+e^{-t}}
σ(t)=1+e−t1
当 t 趋于无穷小时,函数值趋于 0;当 t 趋于无穷大时,函数值趋于 1;它是一条平滑的 S 型曲线,如下图所示:
所以我们将自变量整体带入后,就可以得到逻辑回归的预测函数为:
p
^
=
1
1
+
e
−
W
T
x
+
b
\\color{Violet}\\hat p=\\frac{1}{1+e^{-W^{T}x+b}}
p^=1+e−WTx+b1
2.相关代码
2.1LogisticsRegression类
import numpy as np
import warnings
warnings.filterwarnings("ignore")
#逻辑回归模型
class LogisticsRegression:
#和线性回归模型一样,我们最后要求得还是θ向量
def __init__(self):
'''初始化逻辑回归模型'''
self.theta = None
#定义sigmoid函数,将结果压缩到(0,1)之间
def sigmoid(self,x):
'''
sigmoid函数
:param x: 转换前的输入
:return: 转换后的概率
'''
return 1/(1+np.exp(-x))
#使用梯度下降法,不断更新θ值
def fit(self,x,y,eta=1e-3,n_iters=1e4):
'''
训练逻辑回归模型
:param x: 训练集特征数据,类型为ndarray
:param y: 训练集标签,类型为ndarray
:param eta: 学习率,类型为float
:param n_iters: 训练轮数,类型为int,默认值为10000
:return: 模型参数,类型为ndarray
'''
self.theta = np.zeros(x.shape[1])#给theta赋初值,原始值都为0
i_iter = 0
while i_iter < n_iters:
print("训练轮次:", i_iter)
gradient = (self.sigmoid(x.dot(self.theta))-y).dot(x)#求当出当前梯度
self.theta = self.theta -eta*gradient#更新theta
i_iter += 1
# 预测函数
def predict(self,x):
'''
:param x: 测试集特征数据,类型为ndarray
:return: 与测试
'''
a = self.sigmoid(x.dot(self.theta))#通过sigmoid函数,将预测值变为概率值
return np.array(a >= 0.5, dtype='int')#当概率值大于0.5时,则认为是属于标签 1
# 求准确率
def score(label, predict):
'''
:param label: 测试集标签数据,类型为ndarray
:param predict: 预测标签数据,类型为ndarray
'''
label=label.astype(np.int)#将label转换为numpy.int类型
return np.mean(label == predict) #该函数求的是平均值
2.2求解代码
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
#读取数据,csv文件中最后一列为标签值,其他列都为特征值(这里带入自己的数据即可,注意每个变量代表的含义)
data = pd.read_csv('/data/shixunfiles/3efa9f920dd798c7a3c754a0f9e1da2d_1577432653240.csv')
#提取特征值和标签值
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
#对数据进行标准化
#减去一列的平均值除以一列的标准差
X = (X-np.mean(X,axis=0))/np.std(X,axis=0)
#对特征值加一列x0,x0的所有值为1,相当于偏离值b的系数(前面线性回归模型说过)
X = np.hstack([np.ones(shape=(len(X),1)),X])
#划分训练集与测试集,参数test_size设为0.2,random_state设为21
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 21)
#建立模型,并训练模型
Lr = LogisticsRegression()
Lr.fit(x_train,y_train)
#用测试数据集进行预测
predict = Lr.predict(x_test)
#评估预测的准确率
score = score(y_test,predict)
print(score)
2.3输出结果
3.直接调库使用
∙ \\bullet ∙ 实际在使用时,不需要自己实现逻辑回归的模型,此时我们直接调库即可;
∙
\\bullet
∙ 格式为:from sklearn.linear_model import LogisticRegression
∙ \\bullet ∙ 常用方法如下:
方法格式 | 含义 |
---|---|
fit(X,y) | 拟合线性回归模型,X为特征值矩阵,y为标签向量 |
predict(X) | 得到模型预测的结果向量,X为输入特征值矩阵 |
score(X,y) | 得到正确率,X为测试用例预测标签,y为真实结果的标签 |
以上是关于逻辑回归|机器学习|分类算法的主要内容,如果未能解决你的问题,请参考以下文章