欢迎关注本人的微信公众号AI_Engine
LogisticRegression
算法原理
- 一句话概括:逻辑回归假设数据服从伯努利分布,通过极大化似然函数(损失函数)的方法,运用梯度下降或其他优化算法来求解参数,来达到将数据二分类的目的。
- 定义:逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性(不是概率)。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。 注意,这里用的是“可能性”,而非数学上的“概率”,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用。该结果往往用于和其他特征值加权求和,而非直接相乘。
- 区别:逻辑回归(Logistic Regression)与线性回归(Linear Regression)都是一种广义线性模型(generalized linear model)。逻辑回归假设因变量y服从伯努利分布,而线性回归假设因变量y服从高斯分布。因此与线性回归有很多相同之处,如果去除sigmoid映射函数的话,逻辑回归算法就是一个线性回归。可以说,逻辑回归是以线性回归为理论支持的,但是逻辑回归通过sigmoid函数引入了非线性因素,因此可以轻松处理二分类问题。
- 函数:sigmoid函数是逻辑回归中的假设函数,正是因为sigmoid函数与线性回归的结合才使得逻辑回归具有二分类的作用。sigmoid表达式与曲线如下所示:
- 决策边界:阈值的方程。当阈值为0.5时,对于sigmoid函数来说z=0就是该模型的决策边界。
- 损失函数:在逻辑回归中,最常用的是代价函数是交叉熵(Cross Entropy)
- 特征离散化:工业界很少直接将连续值作为LR模型的特征输入,而是将连续特征值离散化为一系列的0、1特征交给LR模型。其优势如下:
- 离散特征的增加和减少都很容易,易于模型的快速迭代;
- 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
- 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
- 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
- 离散化后可以进行特征交叉,由M+N个变量变为M * N个变量,进一步引入非线性,提升表达能力;
- 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
- 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。
实例
def build_train_model(x, y):
length_sample = len(x)
simple_weight = np.ones(shape=(length_sample,))
# simple_weight[:length_sample/2] = 2
model = LogisticRegression(penalty='l2', C=1.0, solver='sag', max_iter=3000, multi_class='ovr')
model.fit(x, y, simple_weight)
return model
def cross_val(x, y):
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=Config.seed)
model = LogisticRegression(penalty='l2', C=1.0, solver='sag')
result = cross_val_score(model, x, y, cv=skf)
print(result)
def report_evaluation_metrics(y_true, y_pred):
accuracy = accuracy_score(y_true=y_true, y_pred=y_pred)
precision = precision_score(y_true=y_true, y_pred=y_pred, labels=[0, 1], pos_label=1)
recall = recall_score(y_true=y_true, y_pred=y_pred, labels=[0,