python 逻辑回归算法 P值计算 python逻辑回归结果解读_python逻辑回归

逻辑回归定义

logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。逻辑回归为发生概率除以没有发生概率再取对数,且因变量为二分类的分类变量或某事件的发生率。

例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,所得值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。***摘自百度百科

逻辑回归的使用

逻辑回归属于回归算法,但个人感觉这是一个分类的算法,可以是二分类,或者多分类,多分类不太好解释,而且如果自变量中含有分类变量,需要我们转化成虚拟变量(也叫哑元变量),转化后的虚拟变量只需要保留自变量类别数-1即可。常见的判别方法一般是根据一个概率也就是阈值(0-1)把因变量分成两等(0或者1),像疾病的判别,寿命、质量的界定都适用。简直是日常生活中纠结的二分类终结者;最后大家可以根据结果检验猜想,做到看数据说话。

逻辑回归的实现

下面是一个我在网上查看到的二分类逻辑回归案例,数据是自己生成的,稍微改了几处地方,使用python3,或者anaconda。

#逻辑回归import pandas as pdimport statsmodels.api as smimport pylab as plimport numpy as npdf = pd.read_excel(r'c:\users\ll\desktop\lr.xlsx')#防止重名,重命名rank列df.columns = ["admit", "gre", "gpa", "prestige"]#查看列名print(df.columns)#描述统计print(df.describe())#标准差print(df.std())# 频率表,表示prestige与admin的值相应的数量关系#print (pd.crosstab(df['admit'], df['prestige'], rownames=['admit']))#绘制图形df.hist()pl.show()#虚拟变量虚拟变量,也叫哑变量,可用来表示分类变量、非数量因素可能产生的影响。#在计量经济学模型,需要经常考虑属性因素的影响。例如,职业、文化程度、季节等属性因素往往很难直接度量它们的大小。#只能给出它们的“Yes—D=1”或”No—D=0”,或者它们的程度或等级。为了反映属性因素和提高模型的精度,必须将属性因素“量化”。#通过构造0-1型的人工变量来量化属性因素。# 将prestige设为虚拟变量dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige')print(dummy_ranks.head())# 为逻辑回归创建所需的dataframe# 除admit、gre、gpa外,加入了上面常见的虚拟变量(注意,引入的虚拟变量列数应为虚拟变量总列数减1,减去的1列作为基准)cols_to_keep = ['admit', 'gre', 'gpa']need=dummy_ranks.loc[:,['prestige_2','prestige_3','prestige_4']]data = df[cols_to_keep].join(need)print(data.head())#数据原本的prestige属性就被prestige_x代替了,例如原本的数值为2,则prestige_2为1,prestige_1、prestige_3、prestige_4都为0。# 需要自行添加逻辑回归所需的intercept变量data['intercept'] = 1.0print(data)# 指定作为训练变量的列,不含目标列`admit`train_cols = data.columns[1:]# Index([gre, gpa, prestige_2, prestige_3, prestige_4], dtype=object)logit = sm.Logit(data['admit'], data[train_cols])# 拟合模型result = logit.fit()#查看模型结果print(result.summary())# 构建预测集# 与训练集相似,一般也是通过 pd.read_excel() 读入# 在这边为方便,我们将训练集拷贝一份作为预测集(不包括 admin 列)import copycombos = copy.deepcopy(data)# 数据中的列要跟预测时用到的列一致predict_cols = combos.columns[1:]# 预测集也要添加intercept变量combos['intercept'] = 1.0# 进行预测,并将预测评分存入 predict 列中combos['predict'] = result.predict(combos[predict_cols])# 预测完成后,predict 的值是介于 [0, 1] 间的概率值# 我们可以根据需要,提取预测结果# 例如,假定 predict > 0.5,则表示会被录取# 在这边我们检验一下上述选取结果的精确度total = 0hit = 0for value in combos.values:  # 预测分数 predict, 是数据中的最后一列  predict = value[-1]  # 实际录取结果  admit = int(value[0])  # 假定预测概率大于0.5则表示预测被录取  if predict > 0.5:    total += 1    # 表示预测命中    if admit == 1:      hit += 1# 输出结果print('Total: %d, Hit: %d, Precision: %.2f' % (total, hit, 100.0*hit/total))# Total: 95, Hit: 55, Precision: 57.89#通常,我们可以设定一个阈值(此处取0.5),若 predict 大于该阈值,则认为是被录取了,反之,则表示不被录取。# 查看每个系数的置信区间print(result.conf_int())#0为95%分布下的置信区间下限,1为上限#在这个例子中,我们可以肯定被录取的可能性与应试者毕业学校的声望存在着逆相关的关系。#换句话说,高排名学校(prestige_1==True)的录取的概率比低排名学校(prestige_4==True)要高。#相对危险度(odds ratio),使用每个变量系数的指数来生成odds ratio,可知变量每单位的增加、减少对录取几率的影响。#例如,如果学校的声望为2,则我们可以期待被录取的几率减少大概50%。# 输出 odds ratioprint(np.exp(result.params))# odds ratios and 95% CIparams = result.paramsconf = result.conf_int()conf['OR'] = paramsconf.columns = ['2.5%', '97.5%', 'OR']print(np.exp(conf))

深入挖掘

根据最大最小值使用模型参数判断看看结果误差

from sklearn.utils import extmath from sklearn.utils.extmath import cartesian # 深入挖掘,根据最大、最小值生成 GRE、GPA 均匀分布的10个值,而不是生成所有可能的值gres = np.linspace(data['gre'].min(), data['gre'].max(), 10)print(gres)# array([ 220.        ,  284.44444444,  348.88888889,  413.33333333,#         477.77777778,  542.22222222,  606.66666667,  671.11111111,#         735.55555556,  800.        ])gpas = np.linspace(data['gpa'].min(), data['gpa'].max(), 10)print(gpas)# array([ 2.26      ,  2.45333333,  2.64666667,  2.84      ,  3.03333333,#         3.22666667,  3.42      ,  3.61333333,  3.80666667,  4.        ])# 枚举所有的可能性combos = pd.DataFrame(cartesian([gres, gpas, [1, 2, 3, 4], [1.]]))# 重新创建哑变量combos.columns = ['gre', 'gpa', 'prestige', 'intercept']dummy_ranks = pd.get_dummies(combos['prestige'], prefix='prestige')dummy_ranks.columns = ['prestige_1', 'prestige_2', 'prestige_3', 'prestige_4']# 只保留用于预测的列cols_to_keep = ['gre', 'gpa', 'prestige', 'intercept']combos = combos[cols_to_keep].join(dummy_ranks.iloc[:,[1,2,3]])# 使用枚举的数据集来做预测combos['admit_pred'] = result.predict(combos[train_cols])print(combos.head())def isolate_and_plot(variable):    # isolate gre and class rank    grouped = pd.pivot_table(combos, values=['admit_pred'], index=[variable, 'prestige'],                            aggfunc=np.mean)    # in case you're curious as to what this looks like    # print grouped.head()    #                      admit_pred    # gre        prestige                # 220.000000 1           0.282462    #            2           0.169987    #            3           0.096544    #            4           0.079859    # 284.444444 1           0.311718    # make a plot    colors = 'rbgyrbgy'    for col in combos.prestige.unique():        plt_data = grouped.loc[grouped.index.get_level_values(1)==col]        pl.plot(plt_data.index.get_level_values(0), plt_data['admit_pred'],                color=colors[int(col)])    pl.xlabel(variable)    pl.ylabel("P(admit=1)")    pl.legend(['1', '2', '3', '4'], loc='upper left', title='Prestige')    pl.title("Prob(admit=1) isolating " + variable + " and presitge")    pl.show()isolate_and_plot('gre')isolate_and_plot('gpa')#结果图显示了 gre, gpa 和 prestige 如何影响录取。#可以看出,随着 gre 的增加,录取可能性如何逐渐降低,随着 gpa 的增加,录取可能性逐渐升高,并且,不同的学校声望对录取可能性的增加程度相差很大。

python 逻辑回归算法 P值计算 python逻辑回归结果解读_逻辑回归 python_02

此图代表了逻辑回归的生长曲线,趋势基本是一致的;

机器学习分类算法有很多,回归模型我目前常用的就是多元回归和逻辑回归了,都是监督学习类别。

此外机器学习除了监督学习(回归+分类),还有非监督学习(聚类)。