python统计分析--4.Logistic回归

0.Logistic模型简介

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

  • 概念
    logistic回归是一种广义线性回归(generalized linear model,GLM),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。
    logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。
  • Logistic回归模型的适用条件
  1. 因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于Logistic回归。
  2. 残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。
  3. 自变量和Logistic概率是线性关系
  4. 各观测对象间相互独立。
  • 原理:
    如果直接将线性回归的模型扣到Logistic回归中,会造成方程二边取值区间不同和普遍的非直线关系。因为Logistic中因变量为二分类变量,某个概率作为方程的因变量估计值取值范围为0-1,但是,方程右边取值范围是无穷大或者无穷小。所以,才引入Logistic回归。
  • Logistic回归实质:
    发生概率除以没有发生概率再取对数。就是这个不太繁琐的变换改变了取值区间的矛盾和因变量自变量间的曲线关系。究其原因,是发生和未发生的概率成为了比值 ,这个比值就是一个缓冲,将取值范围扩大,再进行对数变换,整个因变量改变。不仅如此,这种变换往往使得因变量和自变量之间呈线性关系,这是根据大量实践而总结。所以,Logistic回归从根本上解决因变量要不是连续变量怎么办的问题。还有,Logistic应用广泛的原因是许多现实问题跟它的模型吻合。例如一件事情是否发生跟其他数值型自变量的关系。
  • 注意:
    如果自变量为字符型,就需要进行重新编码。一般如果自变量有三个水平就非常难对付,所以,如果自变量有更多水平就太复杂。这里只讨论自变量只有三个水平。非常麻烦,需要再设二个新变量。共有三个变量,第一个变量编码1为高水平,其他水平为0。第二个变量编码1为中间水平,0为其他水平。第三个变量,所有水平都为0。实在是麻烦,而且不容易理解。最好不要这样做,也就是,最好自变量都为连续变量。
  • python代码如下
#导入包
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from sklearn import linear_model
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.model_selection import train_test_split,cross_val_score
df=pd.read_excel("bankloan_binning.xlsx")
print(df.head(2))
#训练集和测试集
xtrain,xtest,ytrain,ytest=train_test_split(df.iloc[:,[2,3,4,5,6,7,8,9]],df.iloc[:,-1]
                                           ,test_size=0.2,random_state=0)#train_size=0.8
#验证集
xtrain1,xvalid,ytrain1,yvalid=train_test_split(xtrain,ytrain
                                           ,test_size=0.2,random_state=0)#train_size=0.8

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1. python数据处理标准流程

第一、导入包和对应的类
第二、实例化
第三、拟合数据
第四、评估模型
第五、预测评分
在这里插入图片描述

#-----------python数据处理标准流程------------
#第一、导入包和对应的类
#第二、实例化
#第三、拟合数据
#第四、评估模型
#第五、预测评分

#分类预测
from sklearn import linear_model
log=linear_model.LogisticRegression(solver="lbfgs",C=3)
#"lbfgs"慢但稳健;"newton-cg"不能处理多分类,但比lbfgs快;"sag"处理大型的列和行,二分类;
log.fit(xtrain,ytrain)#拟合训练集数据
log.score(xtest,ytest)#非监督模型是transform,R方值
y_log=log.predict(xtest)#predict_proba

log.coef_#回归系数
exp=np.exp(log.coef_)#or值,解释业务关系
gamma=(exp-1)/(exp+1)#gamma值,解释变量相关强度
print([exp,gamma])

# 老(新)样本预测
x1=np.array([[2,1,3.767992,3.90,0.504108,3.767992,2.90,1.504108],
             [3,4,0.767992,3.90,1.504108,3.767992,0.90,1.504108]])
pdata=pd.DataFrame(log.predict_proba(x1))#fit.predict表示预测值
pdata.head(6)

在这里插入图片描述

2. 混淆矩阵与预测

#-----------混淆矩阵与预测-----------
#(1)预测分类
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
import mglearn
# mglearn.plots.plot_binary_confusion_matrix()

cm=confusion_matrix(ytest,y_log)
print(classification_report(ytest,y_log,target_names=['非违约','违约']))
sns.heatmap(cm,fmt="d",cmap="gist_rainbow",annot=True,center=True)#annot将数值显示在单元格里

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 交叉验证

交叉验证适合支持向量机(SVM)和决策树算法,其他也能用,用的比较少
在这里插入图片描述

#-----------交叉验证-----------
from sklearn.model_selection import cross_val_score,LeaveOneOut,KFold,GroupKFold
cross_val_score(log,xtrain,ytrain,cv=3,scoring="f1")#默认是正确率,参数scoring="precision"or"recall",'f1'
print('交叉验证:%s'%scores1);
print('平均交叉验证得分:%s'% np.mean(scores1))

4. 网格搜索

#-----------#6.网格搜索-----------
from sklearn.model_selection import GridSearchCV

#GridSearchCV网格搜索
parameters={'solver':['newton-cg','lbfgs', 'liblinear','sag','saga'],
            #'penalty':['l2','l1'],#l2岭回归,l1为lasso,强调可解释
            'C':[0.3,1,2] # 可以设置范围*range(0,10)       
           }
#线性回归中叫algha系数,logistic和svm叫C。惩罚系数的倒数,值越小,正则化越大(惩罚越大),修正过拟合,共线性
grid_search=GridSearchCV(log,parameters,cv=3,n_jobs=-1)#scoring='accuracy'
grid_search.fit(xtrain,ytrain)
print("最优得分:%s" %grid_search.best_score_)
print("测试得分:%s" %grid_search.score(xtest,ytest))
print("全部及最优系数:%s" %grid_search.best_estimator_)
print("定义搜索的最优系数:%s" %grid_search.best_params_)

#最后使用最优系数构建模型
model=grid_search.best_estimator_
ypre=model.fit(xtrain,ytrain).predict_proba(xtrain)#预测概率
ypre[:6]

在这里插入图片描述

5. pipeline管道

#==============7.pipeline管道=============
#Pipeline需要命名;make_pipeline不需要命名
import sklearn.neighbors._base
import sys
sys.modules['sklearn.neighbors.base'] = sklearn.neighbors._base
#----------------标准管道---------------------------
#分类器前的预分析:特征提取(主成分)、特征选择(变量选择)、缩放(各种变量变换)、分类(聚类)、缺失值
from sklearn.pipeline import Pipeline 
from sklearn.preprocessing import * #预处理
from sklearn.feature_selection import SelectFromModel #筛选
from sklearn.svm import LinearSVC
from sklearn.ensemble import RandomForestClassifier
from missingpy import MissForest

pipe = Pipeline([ 
               ("缺失值1",MissForest(n_estimators=2,min_samples_leaf=9000)),#随机森林
               ("规范化2",MinMaxScaler(feature_range=(0,1))),#最小值与最大值转化
               ("特征选择3",SelectFromModel(LinearSVC(penalty="l2",random_state=0),max_features=3)),#从模型找出最好的3个变量
               ("模型4",RandomForestClassifier(oob_score=True,random_state=0))#随机森林分类器
               ])
rf_clf=pipe.fit(xtrain,ytrain)#rf是随机森林缩写,clf是分类

print('缺失值统计量:',pipe.named_steps['缺失值1'].statistics_)
print('变量变换:',pipe.named_steps['规范化2'].data_range_)
print('特征选择:',pipe.named_steps['特征选择3'].get_support())#筛选标记
print('构建模型:',pipe.named_steps['模型4'].feature_importances_)#变量重要性
print('模型评分:',pipe.score(xtest,ytest))#主要使用测试集评分

#----------------管道与网格搜索、交叉验证---------------------------
from sklearn.model_selection import GridSearchCV

#定义数据流
pipe_gc = Pipeline([ 
               ("缺失值1",MissForest(n_estimators=2,min_samples_leaf=9000)),
               ("规范化2",MinMaxScaler(feature_range=(0,1))),
               ("特征选择3",SelectFromModel(LinearSVC())),
               ("模型4",RandomForestClassifier())
               ])

#定义参数:主要参数名需要加步骤的标签
# param_p=[{'特征选择3__max_features':[2,4,6]},
#          {'模型4__min_samples_leaf':[1000,2000,5000],
#           '模型4__n_estimators':[2,5,6]}
#         ]

# grid_search_p=GridSearchCV(estimator=pipe_gc,param_grid=param_p,cv=2,n_jobs=-1)
# grid_search_p.fit(xtrain,ytrain)
# print("测试得分:%s" %grid_search_p.score(xtest,ytest))
# print("全部及最优系数:%s" %grid_search_p.best_estimator_)
# print("定义搜索的最优系数:%s" %grid_search_p.best_params_)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值