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转换
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、随着阙值降低,灵敏度升高,特异度在下降
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()
使用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
本文只适用于学习总结使用。
- Logistic回归模型和Zeppelin简单使用
- Logistic回归模型和Python实现
- Logistic regression回归模型
- logistic 回归模型
- logistic回归模型总结
- Logistic回归模型
- matlab Logistic回归模型
- 关于逻辑回归(Logistic regression)模型的简单思考
- 如何在R语言中使用Logistic回归模型 详解
- R语言logistic回归模型
- Logistic Regression逻辑回归模型
- 线性回归和logistic回归
- logistic回归和logic回归
- logistic回归和softmax回归
- 分类和Logistic回归
- 线性回归,logistic回归和一般回归
- 线性回归,logistic回归和一般回归
- 线性回归,logistic回归和一般回归
- [cv]Fourier-transform
- python 函数 —— list.sort()
- Spring Boot 入门
- C++常用STL汇总(以容器为主)
- 我的Linux环境
- Logistic回归模型和Zeppelin简单使用
- Python 基础 —— 判断一个对象是否为可迭代对象
- [CSU 1915 John and his farm]树形DP+LCA
- 1-IOC容器的主要接口设计
- Python 基础 —— 匿名函数 lambda
- 将一台机器上的文件移动到另一台ftp服务器
- 2-BeanFactory容器的设计原理
- 我党历史上的土地革命
- Python 基础 —— float("inf") 无穷的相关问题