简单来说,逻辑回归就是来解决二分类(0或1)的问题的机器学习方法,用于评估事件发生或者不发生的可能性。比如你是否会购买这个西瓜,你是否患有某种疾病等等。
逻辑回归与线性回归是什么关系呢?
逻辑回归(Logistic Regression)与线性回归(Linear Regression)都是一种广义线性模型(generalized linear model)。逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布。因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,逻辑回归算法就是一个线性回归。可以说,逻辑回归是以线性回归为理论支持的,但是逻辑回归通过Sigmoid函数引入了非线性因素,因此可以轻松处理0/1分类问题。Sigmoid函数如下:
Sigmoid 函数是一个 S 形曲线,它可以将任意实数值映射到介于 0 和 1 之间的值,但并不能取到 0或1。然后使用阈值分类器将 0 和 1 之间的值转换为 0 或 1。
import numpyimport mathimport matplotlib.pyplot as pltdef sigmoid(x): a = [] for item in x: a.append(1.0/(1.0 + math.exp(-item))) return ax = numpy.arange(-10, 10, 0.1)y = sigmoid(x)plt.plot(x,y)plt.yticks([0.0, 0.5, 1.0])plt.axhline(y=0.5, ls='dotted', color='k')plt.show()
泰坦尼克号生存案例
#建立模型import pandas as pdimport numpy as npimport statsmodels.api as smimport warningsimport matplotlib.pyplot as pltwarnings.filterwarnings("ignore")df = pd.read_csv('/Users/jingjingdehnaa/Desktop/mytrain.csv')#Survived:生否存活;Age:年龄;Sex:性别;Pclass:船舱级别data = df[['Survived','Age','Sex','Pclass']]data.replace({'male':1,'female':2},inplace = True)#性别更改为可比较值data.fillna({'Age':data['Age'].mean()},inplace = True)#年龄缺失值添加为平均年龄#虚拟变量,也叫哑变量,可用来表示分类变量、非数量因素可能产生的影响。#在计量经济学模型,需要经常考虑属性因素的影响。例如,职业、文化程度、季节等属性因素往往很难直接度量它们的大小。#通过构造0-1型的人工变量来量化属性因素。dummy_pclass = pd.get_dummies(data['Pclass'],prefix ='Pclass')#强调一点,生成m个虚拟变量后,只要引入m-1个虚拟变量到数据集中,未引入的一个是作为基准对比的。f_data = data[['Survived','Age','Sex']].join(dummy_pclass.iloc[:,1:])f_data['intercept'] = 1#手动添加截距#指定变量列train_cols = f_data.columns[1:]#执行logistic回归logit = sm.Logit(f_data['Survived'],f_data[train_cols])result = logit.fit()result.summary()Logit Regression ResultsDep. Variable: Survived No. Observations: 891Model: Logit Df Residuals: 886Method: MLE Df Model: 4Date: Mon, 26 Oct 2020 Pseudo R-squ.: 0.3214Time: 20:20:14 Log-Likelihood: -402.64converged: True LL-Null: -593.33Covariance Type: nonrobust LLR p-value: 2.946e-81 coef std err z P>|z| [0.025 0.975]Age -0.0333 0.007 -4.519 0.000 -0.048 -0.019Sex 2.6113 0.187 13.986 0.000 2.245 2.977Pclass_2 -1.1222 0.258 -4.354 0.000 -1.627 -0.617Pclass_3 -2.3292 0.241 -9.669 0.000 -2.801 -1.857intercept -1.6779 0.389 -4.317 0.000 -2.440 -0.916
#通过模型预测数据import copycombos = copy.deepcopy(f_data)# 指定变量列predict_cols = f_data.columns[1:]# 手动添加intercept变量combos['intercept'] = 1.0# 将预测结果加入comboscombos['predict'] = result.predict(combos[predict_cols])# 假定 >0.5表示命中total = 0hit = 0for value in combos.values: # 预测存活 数据中的最后一列 predict = value[-1] # 实际存活结果 数据中的第一列 Survived = int(value[0]) # 假定预测概率大于0.5则表示预测存活 if predict > 0.5: total += 1 # 预测命中 if Survived == 1: hit += 1 # 输出结果print(‘预测存活:’,total)print('预测命中:',hit)print('预测命中率:',hit/total)预测存活:323预测命中:244预测命中率:0.755