原创R语言Logistic逻辑回归算法案例数据分析报告.docx
《原创R语言Logistic逻辑回归算法案例数据分析报告.docx》由会员分享,可在线阅读,更多相关《原创R语言Logistic逻辑回归算法案例数据分析报告.docx(8页珍藏版)》请在冰豆网上搜索。
![原创R语言Logistic逻辑回归算法案例数据分析报告.docx](https://file1.bdocx.com/fileroot1/2022-11/20/ef0a302a-0311-4fcb-b75d-a203c9284382/ef0a302a-0311-4fcb-b75d-a203c92843821.gif)
原创R语言Logistic逻辑回归算法案例数据分析报告
R语言Logistic逻辑回归算法案例
如果线性回归用于预测连续的Y变量,则逻辑回归用于二元分类。
如果我们使用线性回归来模拟二分变量(作为Y),则得到的模型可能不会将预测的Ys限制在0和1之内。
此外,线性回归的其他假设(例如误差的正态性)可能会被违反。
因此,我们建模事件ln的对数几率(P1-P.)升ñ(P1-P),其中,P是事件的概率。
上面的等式可以使用参数glm()设置来建模。
但是我们对事件的概率比事件的对数几率更感兴趣。
因此,上述模型的预测值,即事件的对数几率,可以转换为事件概率,如下所示:
family"binomial"
使用该plogis()函数实现此转换,如下所示,当我们构建logit模型并进行预测时。
示例问题
让我们尝试使用基于adult数据中可用的人口统计变量的逻辑回归来预测个人是否会获得超过50,000美元的收入。
在这个过程中,我们将:
1.导入数据
2.检查课堂偏见
3.创建培训和测试样本
4.计算信息值以找出重要变量
5.构建logit模型并预测测试数据
6.做模型诊断
导入数据
inputData<-read.csv("
head(inputData)
#=>AGEWORKCLASSFNLWGTEDUCATIONEDUCATIONNUMMARITALSTATUS
#=>139State-gov77516Bachelors13Never-married
#=>250Self-emp-not-inc83311Bachelors13Married-civ-spouse
#=>338Private215646HS-grad9Divorced
#=>453Private23472111th7Married-civ-spouse
#=>528Private338409Bachelors13Married-civ-spouse
#=>637Private284582Masters14Married-civ-spouse
#OCCUPATIONRELATIONSHIPRACESEXCAPITALGAINCAPITALLOSS
#=>1Adm-clericalNot-in-familyWhiteMale21740
#=>2Exec-managerialHusbandWhiteMale00
#=>3Handlers-cleanersNot-in-familyWhiteMale00
#=>4Handlers-cleanersHusbandBlackMale00
#=>5Prof-specialtyWifeBlackFemale00
#=>6Exec-managerialWifeWhiteFemale00
#HOURSPERWEEKNATIVECOUNTRYABOVE50K
#=>140United-States0
#=>213United-States0
#=>340United-States0
#=>440United-States0
#=>540Cuba0
#=>640United-States0
检查类偏差
理想情况下,Y变量中事件和非事件的比例应大致相同。
因此,让我们首先检查因变量中类的比例ABOVE50K。
table(inputData$ABOVE50K)
#01
#247207841
显然,存在阶级偏差,当事件的比例远小于非事件的比例时观察到的条件。
所以我们必须以大致相等的比例对观测结果进行采样,以获得更好的模型
创建培训和测试样本
解决类偏差问题的一种方法trainingData是以相等的比例绘制(开发样本)的0和1。
在这样做时,我们会将inputData未包含的其余部分用于培训testData(验证样本)。
因此,开发样本的大小将小于验证,这是可以的,因为有大量的观察结果(>10K)。
#CreateTrainingData
input_ones<-inputData[which(inputData$ABOVE50K==1),]#all1's
input_zeros<-inputData[which(inputData$ABOVE50K==0),]#all0's
set.seed(100)#forrepeatabilityofsamples
input_ones_training_rows<-sample(1:
nrow(input_ones),0.7*nrow(input_ones))#1'sfortraining
input_zeros_training_rows<-sample(1:
nrow(input_zeros),0.7*nrow(input_ones))#0'sfortraining.Pickasmany0'sas1's
training_ones<-input_ones[input_ones_training_rows,]
training_zeros<-input_zeros[input_zeros_training_rows,]
trainingData<-rbind(training_ones,training_zeros)#rowbindthe1'sand0's
#CreateTestData
test_ones<-input_ones[-input_ones_training_rows,]
test_zeros<-input_zeros[-input_zeros_training_rows,]
testData<-rbind(test_ones,test_zeros)#rowbindthe1'sand0's
接下来,需要找到变量的信息值,以了解它们在解释因变量(ABOVE50K)时的价值。
为分类变量创建WOE(可选)
或者,我们可以WOE为所有分类变量创建等价物。
这只是一个可选步骤,为简单起见,此步骤不适用于此分析。
for(factor_varinfactor_vars){
inputData[[factor_var]]<-WOE(X=inputData[,factor_var],Y=inputData$ABOVE50K)
}
head(inputData)
#>AGEWORKCLASSFNLWGTEDUCATIONEDUCATIONNUMMARITALSTATUSOCCUPATION
#>1390.1608547775160.797410413-1.8846680-0.713645
#>2500.2254209833110.7974104130.93483311.084280
#>338-0.1278453215646-0.52012579-1.0030638-1.555142
#>453-0.1278453234721-1.780502170.9348331-1.555142
#>528-0.12784533384090.7974104130.93483310.943671
#>637-0.12784532845821.3690863140.93483311.084280
#>RELATIONSHIPRACESEXCAPITALGAINCAPITALLOSSHOURSPERWEEK
#>1-1.0153180.080647150.32811872174040
#>20.9418010.080647150.32811870013
#>3-1.0153180.080647150.32811870040
#>40.941801-0.807946760.32811870040
#>51.048674-0.80794676-0.94801650040
#>61.0486740.08064715-0.94801650040
#>NATIVECOUNTRYABOVE50K
#>10.025383180
#>20.025383180
#>30.025383180
#>40.025383180
#>50.116715640
#>60.025383180
计算信息值
该smbinning:
:
smbinning函数使用递归分区将连续变量转换为分类变量。
我们将首先将它们转换为分类变量,然后捕获所有变量的信息值iv_df
library(smbinning)
#segregatecontinuousandfactorvariables
factor_vars<-c("WORKCLASS","EDUCATION","MARITALSTATUS","OCCUPATION","RELATIONSHIP","RACE","SEX","NATIVECOUNTRY")
continuous_vars<-c("AGE","FNLWGT","EDUCATIONNUM","HOURSPERWEEK","CAPITALGAIN","CAPITALLOSS")
iv_df<-data.frame(VARS=c(factor_vars,continuous_vars),IV=numeric(14))#initforIVresults
#computeIVforcategoricals
for(factor_varinfactor_vars){
smb<-smbinning.factor(trainingData,y="ABOVE50K",x=factor_var)#WOEtable
if(class(smb)!
="character"){#heckifsomeerroroccured
iv_df[iv_df$VARS==factor_var,"IV"]<-smb$iv
}
}
#computeIVforcontinuousvars
for(continuous_varincontinuous_vars){
smb<-smbinning(trainingData,y="ABOVE50K",x=continuous_var)#WOEtable
if(class(smb)!
="character"){#anyerrorwhilecalculatingscores.
iv_df[iv_df$VARS==continuous_var,"IV"]<-smb$iv
}
}
iv_df<-iv_df[order(-iv_df$IV),]#sort
iv_df
#>VARSIV
#>RELATIONSHIP1.5739
#>MARITALSTATUS1.3356
#>AGE1.1748
#>