逻辑回归实战--R/python代码
逻辑回归实战--R/python代码
目录
逻辑回归
又称logistic回归分析,是一种广义的线性回归分析模型;
与多重线性回归的最大区别就是因变量不同,多重线性回归因变量是连续的,而逻辑回归是二项分布(其实逻辑回归的因变量可以是二分类,也可以是多分类,但是二分类更为常用)。
逻辑回归主要思想是把线性函数,运用Sigmoid函数(逻辑函数或者增长函数)将因变量映射在(0,1)区间上,本文主要是讲代码实战,所以不过多分析模型算法和推导。
1、R语言实现:
R是所有统计工具里面比较简单上手的一个,学习R不需要任何语言基础,只需要加载相关的包,几行代码就可以轻松实现。
1.1 传统统计学算法
代码解析
data<-read.table("/Users/admin/Desktop/模型数据/model.csv",header=TRUE,sep=",")
fit.logit<-glm(y~.,data=data,family=binomial())
summary(fit.logit)
结果查看:
从上面结果可以看出,包括常数项所有参数估计值全部是显著的。
(PS:如果只有部分变量是显著的话(比如:x1、x2、x3是显著的),代码可以改成:fit.logit<-glm(y~x1+x2+x3,data=data,family=binomial()),y~后面跟“.”,默认因变量与所有自变量进行拟合求解,binomial表示因变量为二分类)
以上为传统统计建模思想,只需要根据参数的显著性来判定模型的拟合优度,但是现在比较流行的机器学习算法,基本不看参数的显著性,主要根据最终的准确率或召回率来评价模型的优劣,在这里我们也介绍下机器学习的逻辑回归的实现。
首先我们先用tensor flow的流程(阿里云机器学习平台PAI)来看一下,机器学习的视线流程:
机器学习的主要思想就是:
把数据集拆分成训练集和测试集,用训练集来进行建模,测试集进行检验,
最后根据混淆矩阵的总体精准度和召回率来评判模型。
1.2机器学习:
下面我们用R把机器学习思想进行实现
tt<-sample(2,nrow(data),replace=T,prob=c(0.7,0.3))
train<-data[tt==1,]
test<-data[tt==2,]
fit.logit<-glm(y~.,data=train,family=binomial())
predict<-predict(fit.logit,type='response',newdata=test)
real<-test$y
res<-data.frame(real,predict=ifelse(predict>0.5,'t','f'))
table(real,predict=ifelse(predict>0.5,'t','f'))
混淆矩阵结果:
关于混淆矩阵的理解可以参考:混淆矩阵
至此,R实现逻辑回归的算法的代码已经全部介绍完,下面附录一份完整代码:
data<-read.table("/Users/admin/Desktop/模型数据/model.csv",header=TRUE,sep=",")
fit.logit<-glm(y~.,data=data,family=binomial())
summary(fit.logit)
tt<-sample(2,nrow(data),replace=T,prob=c(0.7,0.3))
train<-data[tt==1,]
test<-data[tt==2,]
fit.logit<-glm(y~.,data=train,family=binomial())
predict<-predict(fit.logit,type='response',newdata=test)
real<-test$y
res<-data.frame(real,predict=ifelse(predict>0.5,'t','f'))
table(real,predict=ifelse(predict>0.5,'t','f'))
2、python代码实现
2.1传统统计学思想
从上面结果可以看出,所有参数估计值全部是显著的(与R数据源是一致的)。
由于很少有人用python来看统计显著性,所以大部分python需要
将缺少的函数分配回scipy.stats命名空间中:
stats.chisqprob = lambda chisq,df: stats.chi2.sf(chisq, df)
附录代码:
import pandas as pd
data=pd.read_csv("model.csv")
y=data["y"]
col_names = data.columns.tolist()
x_col=col_names[1:]
x=data[x_col]
print(x.describe())
import statsmodels.api as sm
result = sm.Logit(y,x).fit()
from scipy import stats
stats.chisqprob = lambda chisq, df: stats.chi2.sf(chisq, df)
print(result.summary())
predictions = result.predict(x)
predictions[predictions > .5] = 1
predictions[predictions <=.5] = 0
from sklearn.metrics import confusion_matrix
confusion_matrix(y, predictions)
import matplotlib.pyplot as plt
plt.matshow(aa)
plt.title("predict")
plt.colorbar()
plt.ylabel("real")
for x in range(len(aa)): # 数据标签
for y in range(len(aa)):
plt.annotate(aa[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center', color='red')
plt.show()
2.2 python机器学习思想
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
from sklearn.linear_model.logistic import LogisticRegression
classifier=LogisticRegression()
classifier.fit(X_train,y_train)
predictions=classifier.predict(X_test)
confusion_matrix=confusion_matrix(y_test, predictions)
总结:
基于上述分析和代码拆解,逻辑回归的问题基本可以解决了,当然如果想要深入挖掘还有很多东西可以加进来,比如前面说的交叉验证、正则化惩罚项以及梯度下降优化精准度等。
上一篇: 算法笔记之概述