Logistic回归模型和Zeppelin简单使用

来源:互联网 发布:淘宝开放平台人工客服 编辑:程序博客网 时间:2024/05/18 15:25

逻辑回归模型

一、模型用途:

一般用来:
通过一些用户个人信息,社会状态,信用历史,缴费信息等数据建立信用风险模型,来预测用户的违约概率。
信用风险一般有模型:Application模型, Behavior模型,Collection模型。

二、Logistic回归模型:

1、Logistic回归模型与线性回归模型区别

Logic回归模型:用来预测因变量是分类的模型。
线性回归模型:用来预测因变量是连续的模型。
在本案例中因变量只有违约或不违约,转化成数字变量只有1或0,若使用最小二乘法则无法解释预测结果中随机出现的不是1和0的值,eg: 1.5,-0.3 等值。 且因为因变量分类类型较少,无法保证正态分布。

2、Logistic变换:将预测概率进行logic转换

logistic转换方程
i:指个体观察案例
P_i:指第i个案例一个事件中发生的概率
这里写图片描述

Logistic模型介绍

3、模型评估

a、评估方式

样本内评估:利用样本内的同期数据进行验证
样本外评估:利用样本外下一期的数据进行验证

b、评估指标

|预测类型|统计量|
|决策型 |准确率/误分类利润/成本|
|排序型 |ROC指标/Gini指数等|

c、决策性评估

这里写图片描述
1.正确率=(A+D)/(A+B+C+D)
2.灵敏度(Sensitivity ;覆盖率recall)=A/(A+B)
3.命中率(Precision、PV+)=A/(A+C)
4.特异度(Specificity;负例的覆盖率)=D/(C+D)
5.负命中率( PV-) = D/(D+B)
通过灵敏度和特异度可绘制ROC曲线,可用于排序模型的指数

c、ROC曲线:

用于建立的模型回答Y/N,通过Y/N的概率,即灵敏度和特异度,来判断预测的对象是否会做这件事
一般用于客户违约的概率或是事件的影响力上。

d、ROC绘制

1、X轴为1-特异度(Specificity),Y轴为灵敏度(Sensitivity)
2、然后通过不同的阙值求出灵敏度和特异度,然后在画出散点图,再将散点图连起来
3、随着阙值降低,灵敏度升高,特异度在下降
ROC曲线
4、特异度和灵敏度越大越好,即ROC Curve 越鼓,越接近Pefect Classification,AUC∈(0,1) ( 曲线下面积)越大。当曲线下的面积为1时,表示该模型预测完全正确,当面积为0.5时,会与不会分别占百分之五十的概率。
5、ROC曲线结果的取值在[0.5,1]。
一般来说,
[0.5,0.7)表示效果较低,但是预测股票已经很不错了;
[0.7,0.85)表示效果一般;
[0.85,0.95)表示效果良好;
[0.95,0.1]社会科学建模中不大可能出现。
①有时ROC曲线可能会落入对角线以下,这时需检查检验方向与状态值的对应关系
②如果某ROC曲线在对角线两边均有分布,需检查数据或专业背景。
6、当AUC一样大的时候,可能会出现两种状态,左边那个代表违约分值比较高的时候更敏感些。右边代表违约分值比较高的时候更敏感些。
这里写图片描述

三、Zeppelin使用:

BB一个关于Zeppelin在使用过程的折磨我两晚的一个小问题:
1、关于设定Spark master 节点时,本来已经把IP与master对应起来了。但是如果用master表示节点时就是不行。最后改成master实际的IP地址后才OK。
2、Zeppelin好像特别吃电脑配置,所以特别卡的时候可以使用单机模式【local[*]】,自带Spark解释器。
3、Spark可以读取hdfs上文件,也可以读取本地文件。集群时候需要每个节点上上相同的位置都要放一份相同的文件。

Spark 代码:

读取文件

val  rowData = sc.textFile("hdfs://master:9000/data.csv")val rowData = sc.textFile("file:/home/morning/data.csv")//local模式本地文件rowData.take(5).foreach(println) //读取csv中的文件

数据预处理

val data1 = rowData.map(s => s.replaceAll("\"","").split(",")) // "\""should be repalced,取代文本的中引号并用逗号分隔data1.count()data1.map(s => (s.size,1)).countByKey() //查看每行是否有多余的逗号,it is very important for rowdata

通过spark sql 创建DataFrame

import org.apache.spark.sql.types._import org.apache.spark.sql.(Row,functions=>F) //将Spark中functions引入,命名为F,用来操作DataFrameval col_nums = data1.first.size //统计第一行数据sizeval struct = StructType(for (i <- data1.first) yield StructField(i,StringType)) //Creat a schmea struct with all variable be StringTypeval data2 = data1.filter(s => s(1)) != "application_id" && s.size == col_nums).map(p => Row.fromSeq(p)) //Create an RDD[Row]过滤掉第一行和Size不等于Col_num的行val df = sqlContext.createDataFrame(data2.struct) //利用createDataFrame函数Create a DataFramedf.show(5)df.count()

数据转换

//利用dataFrame中Select方法val df1 = select(df("application_id").cast("Int").alias("application_id")df("application_id").cast("Int").alias("application_id"),df("bad_ind").cast("Int").alias("bad_ind"),df("vehicle_year").cast("Int").alias("vehicle_year"),df("vehicle_make"),df("bankruptcy_ind"),df("tot_derog").cast("Int").alias("tot_derog"), df("tot_tr").cast("Int").alias("tot_tr"),df("age_oldest_tr").cast("Int").alias("age_oldest_tr"), df("tot_open_tr").cast("Int").alias("tot_open_tr"),df("tot_rev_tr").cast("Int").alias("tot_rev_tr"),df("tot_rev_debt").cast("Int").alias("tot_rev_debt"),df("tot_rev_line").cast("Int").alias("tot_rev_line"),df("rev_util").cast("Int").alias("rev_util"), df("fico_score").cast("Int").alias("fico_score"), df("purch_price").cast("Float").alias("purch_price"), df("msrp").cast("Int").alias("msrp"), df("down_pyt").cast("Float").alias("down_pyt"), df("loan_term").cast("Int").alias("loan_term"), df("loan_amt").cast("Float").alias("loan_amt"), df("ltv").cast("Int").alias("ltv"), df("tot_income").cast("Int").alias("tot_income"), df("veh_mileage").cast("Int").alias("veh_mileage"),df("used_ind").cast("Int").alias("used_ind"))df1.cachedf1.describe().show() //通过Descirpe function 初步探索数据,返回DataFrame.Spark sql不支持非数值型计算,所以尽量使用对String进行转换df1.printSchema //print Schema

使用Sql进行数据查询和可视化

df1.registerTempTable("df1") //在Sql中注册一个df1的临时表,关闭程序后消失sqlContext.sql("show tables").show()%Sparkval query ="""SELECT bad_ind,used_ind,count(1) as countValue, avg(fico_score) as avg_fico_score, avg(tot_income) as avg_income From df1 WHERE tot_income > 5000 GROUP BY bad_ind,used_ind"""sqlContext.sql(query).show()

sql 查询相关数据
使用Zeppelin进行数据可视化操作可完成简单的报表

%sqlSELECT avg(bad_ind) as bad_ration,Bankruptcy_ind,count(1) as countValue From df1WHERE tot_income > $(Income = 2000) //$符号只在Zeppelin中可视化使用GROUP BY bankruptcy_ind 

这里写图片描述

%sqlSELECT tot_derog, avg(bad_ind) as bad_ratio, avg(fico_score) as avg_fico_score, count(1) as countValueFROM df1WHERE tot_derog BETWEEN ${lower=0} and ${upper=20}GROUP BY tot_derog

这里写图片描述

END

本文只适用于学习总结使用。

0 0
原创粉丝点击