logistic回归
1. logistic回归
1.1 基本原理
Logistic regression 是一种分类模型,其基本思路是寻找超平面把数据区分开,因此其基本思想就是寻找超平面,也就求多元系数的问题,这里采取了梯度下降法来求系数。逻辑回归步骤如下:
列出回归方程,估计回归系数
回归方程:Y=WX
1.2 Sigmoid函数
Sigmoid函数是阈值函数,什么作用呢?一般对于分类问题,总以结果大于零或者小于0来分是属于哪一类,但是在实际问题中,二元类一般划分为0类或者1类,也就是数据集的标签为0或者1。那么直接使用结果来划分类别,以小于0为0类,以大于0为1类,这样处理的话,不利于后面的求解损失函数,因此需要将其转换,最后转化后的结果能落在0,1之间,因此我们就使用了阈值函数,f(t) = 1/(1+e-t),其值域为(0, 1)。该阈值函数使用后,结果如下
1.3 梯度下降法
梯度下降法,只需要求解一阶导数,因此计算的成本比较小,这在大规模的数据集上应用比较广泛。梯度下降法的含义是通过当前点的梯度方向寻找新的迭代点,并从当前点移动到新的迭代点继续重复此过程,一直到寻找到最优解,或者到最大迭代次数。
梯度下降法的流程如下:
1.4 代码实现
定义了一个logisticregression类,类中定义如下:
定义了一个参数数组self.W,训练数据得到的参数就存放于该数组;
定义了sigmoid函数def sig(self, t)
定义了一个训练函数train(self,X,y,alpha, iters),其中将偏置也合并到W数组中,X为输入数据,不过其在fit函数中经过处理,在最后一列添加了一列全为1的常数项,目的是为了将偏置也一并归到W中去,alpha为训练步长,iters为最大迭代次数。
定义了拟合函数fit(self, X, y),其中X为原始输入数据,y为标签,X经过处理,添加了一列全为1的常数项。fit中调用了train()函数进行拟合。
定义了预测函数predict(self, X),这里X也要添加常数项,然后与训练得出的参数进行矩阵运算,得出结果。(代码很简单,就不写注解了)
class LogisticRegression:
def __init__(self):
self.W = []
def sig(self, t):
return 1/(1 + np.exp(-t))
def train(self, X, y, alpha, iters):
w = np.random.rand(X.shape[1])
w = w.reshape(-1, 1)
for i in range(iters):
h = self.sig(X*w)
err = y - h
delta = X.T * err
w += alpha * delta
if i % 100 == 0:
print('ERROR is ', self.error_rate(h, y))
return w
def error_rate(self, h, y):
sum_err = 0
sum_err -= y.T * np.log(h) + (1 - y.T)*np.log(1 - h)
return sum_err
def fit(self, X, y):
X = np.c_[X, np.ones(X.shape[0])]
X = np.mat(X)
y = np.mat(y.reshape(-1, 1))
self.W = self.train(X, y, 0.01, 1000)
def predict(self, X):
X = np.c_[X, np.ones(X.shape[0])]
X = np.mat(X)
h = self.sig(X * self.W)
h = map(lambda x:0 if x<0.5 else 1, h)
h = list(h)
return h
1.5 测试代码
def load_data():
data = load_iris()
x = data.data
y = data.target
x = x[y < 2]
y = y[y < 2]
return x, y
if __name__ == '__main__':
x, y = load_data()
model = LogisticRegression()
model.fit(x, y)
y_pred = model.predict(x)
label = np.c_[y, y_pred]
print(label)
相关阅读
概念:Logistic回归是一种广义的线性回归分析模型,常用于数据挖掘、疾病自动诊断、经济预测等领域。值得一提的是,logistic回归跟多元