特征工程 dataframe格式
import os
import copy
import codecs
import operator
import re
from math import log
from pyspark.sql import SQLContext,Row
from pyspark.mllib.regression import LabeledPoint
from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext
from pyspark.mllib.linalg import SparseVector, DenseVector
#===================================================================================================
#===============================dataframe计算tags的特征选择=============================================
df1=sqlContext.sql("select * from zhangb.isntalled_app_sample")
#总体,各类别样本数量
cnt_samp=df1.count()
cnt_samp1=df1.filter(df1.installed==').count()
cnt_samp0=df1.filter(df1.installed==').count()
#df1注册为表
df1.registerTempTable("table1")
#拆分tags列,统计每个tag的每个类别的数量
df2=sqlContext.sql("select c.pkg,c.installed,count(*) cnt from \
(select b.installed,split(b.pkgs,',')[0] pkg from \
(select imei,installed,pkgs from table1 a \
lateral view explode(split(a.installed_applist, ';')) t as pkgs) b \
where length(b.pkgs)>0 ) c \
group by c.pkg,c.installed order by c.pkg,c.installed")
#df2注册成表 table2
df2.registerTempTable("table2")
#sqlContext.cacheTable("table2")
#计算每个tag的数量
df3=sqlContext.sql("select h.pkg,(h.sumcnt-h.cnt1) cnt01,h.cnt1 cnt11 \
from(select g.pkg,g.sumcnt,case when g.cnt1 is null then 0 else g.cnt1 end as cnt1 \
from(select f.pkg,f.sumcnt,e.cnt1 \
from(select c.pkg,sum(c.cnt) sumcnt from table2 c group by c.pkg ) f \
left outer join \
(select d.pkg,d.cnt cnt1 from table2 d where d.installed=1) e on f.pkg=e.pkg)g)h")
#sqlContext.uncacheTable("table2")
#df3.cache()
#根据相似比选择
df4=df3.withColumn("cnt00",cnt_samp0-df3.cnt01).withColumn("cnt10",cnt_samp1-df3.cnt11).\
withColumn("xsb",((df3.cnt11+1.0)/(cnt_samp1+1.0))/((df3.cnt01+1.0)/(cnt_samp0+1.0)))
###=============*********以上通用**************************************************************
# df41=df4.withColumn("ration1",(df4.cnt11+1.0)/(cnt_samp1+1.0)).\
# withColumn("ration0",(df4.cnt01+1.0)/(cnt_samp0+1.0))
#直接找显著pkg,不给看细化的了
df5=df4.filter("xsb>=1.2 or xsb<=0.8").filter("cnt01+cnt11>=15") #6265个
def gaivchi(p):
args=[int(p[3]),int(p[4]),int(p[1]),int(p[2])]
y1,n1,y2,n2=int(p[3]),int(p[4]),int(p[1]),int(p[2])
a00,a10,a01,a11=int(p[3]),int(p[4]),int(p[1]),int(p[2])
chi2=((a00*a11-a10*a01)**2.0)*(a00+a10+a01+a11)/((a00+a10)*(a01+a11)*(a00+a01)*(a10+a11))
num=2
if len(args) % num != 0:
print "Error len(args)"
arg0=[args[0]+args[2],args[1]+args[3]]
total0 = sum(arg0) + 0.0
result0 = 0.0
for w in arg0:
if w == 0:
result0 += 0
else:
result0 += w / total0 * log( w / total0, 2)
result = 0.0
total = sum(args)+0.0
for x in xrange(len(args) / num):
k = x * num
total_up = 0.0 + sum(args[k:k + num])
arg1=args[k:k + num]
total1 = sum(arg1) + 0.0
result1 = 0.0
for i in arg1:
if i == 0:
result1 += 0
else:
result1 += i / total1 * log( i / total1, 2)
result += total_up / total *(-result1)
woe00=log(((y1+1.0)/(y1+y2+1.0))/((n1+1.0)/(n1+n2+1.0)))
iv00=(((y1+1.0)/(y1+y2+1.0))-((n1+1.0)/(n1+n2+1.0)))*woe00
woe01=log(((y2+1.0)/(y1+y2+1.0))/((n2+1.0)/(n1+n2+1.0)))
iv01=(((y2+1.0)/(y1+y2+1.0))-((n2+1.0)/(n1+n2+1.0)))*woe01
iv0=iv00+iv01
woe10=log(((n1+1.0)/(n1+n2+1.0))/((y1+1.0)/(y1+y2+1.0)))
woe11=log(((n2+1.0)/(n1+n2+1.0))/((y2+1.0)/(y1+y2+1.0)))
iv1=((n1+1.0)/(n1+n2+1.0)-((y1+1.0)/(y1+y2+1.0)))*woe10 + ((n2+1.0)/(n1+n2+1.0)-((y2+1.0)/(y1+y2+1.0)))* woe11
iv2=round((iv0+iv1)/2.0,6)
return [p[0],p[1],p[2],p[3],p[4],p[5],chi2,-result0-result,iv2]
df6=sqlContext.createDataFrame(df5.map(gaivchi),["pkg","cnt01","cnt11","cnt00","cnt10","xsb","chi2","gain","iv"])
df6.registerTempTable("e")
df7=sqlContext.sql("select t.pkg,t.xsb,t.chi2,t.gain,t.iv,rank1,rank2,rank3,rank1+rank2+rank3 rank \
from (select pkg,xsb,chi2,gain,iv, \
row_number()over (order by chi2 ) rank1, \
row_number()over (order by gain ) rank2, \
row_number()over (order by iv ) rank3 \
from e ) t order by rank desc")
#输入要选取的pkg个数:
number=5000
#输出指定个数的pkg
df8=sc.parallelize(df7.head(number)).map(lambda p:p[0])
#rdd文件才能这样保存
df8.saveAsTextFile('hdfs:./installed_pkg')
=====================================================
#输入要选取的pkg个数:
number=10000
#输出指定个数的pkg
lt5_17=sc.parallelize(lt5_16.head(number)).map(lambda p:p[0])
#写成结果矩阵
lt6=sc.broadcast(lt5_17.collect())
def matrix(p):
temp1=[p[0],p[1]]
for i in lt6.value:
if i in p[2]:
temp1.append(1)
else:
temp1.append(0)
return temp1
lt7=data3.filter(lambda p:len(p[2])>0).map(lambda p:(p[0],p[1],(re.split(";|,",p[2]))))
#输出样本矩阵
lt8=lt7.map(matrix)
colname=["gid","age"]+[x for x in lt6.value]
#添加索引保存列名
lt9=sc.parallelize(colname).zipWithIndex()
#成为数据框 注意此处的列索引是 整数型 不是字符型
lt10=sqlContext.createDataFrame(lt9,["colname","rank_gender"])
#保存为sql文件
#rdd文件才能这样保存
lt8.saveAsTextFile('hdfs://getui-bi-hadoop/user/zhangb/gender_model_matrix')
#dataframe保存为表
lt10.saveAsTable(tableName="gender_model_colname",source="parquet",mode="overwrite")
#####转稀疏矩阵
def sparse(p):
vec=[int(x) for x in p[2:]]
lvec=len(vec)
#ind=vec.index(1)
dic1={}
for i in range(lvec):
if vec[i]==1:
dic1[i]=1
return [p[0],p[1],SparseVector(lvec,dic1)]
lt11=lt8.map(sparse)
特征工程 dataframe格式的更多相关文章
- 机器学习入门-数值特征-连续数据离散化(进行分段标记处理) 1.hist(Dataframe格式直接画直方图)
函数说明: 1. .hist 对于Dataframe格式的数据,我们可以使用.hist直接画出直方图 对于一些像年龄和工资一样的连续数据,我们可以对其进行分段标记处理,使得这些连续的数据变成离散化 就 ...
- Python机器学习笔记 使用sklearn做特征工程和数据挖掘
特征处理是特征工程的核心部分,特征工程是数据分析中最耗时间和精力的一部分工作,它不像算法和模型那样式确定的步骤,更多的是工程上的经验和权衡,因此没有统一的方法,但是sklearn提供了较为完整的特征处 ...
- 手把手教你用Python实现自动特征工程
任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置. 特征工程具有强大的潜力,但是手动操作是个缓慢且艰巨的过程.Prateek Joshi,是 ...
- 机器学习-特征工程-Feature generation 和 Feature selection
概述:上节咱们说了特征工程是机器学习的一个核心内容.然后咱们已经学习了特征工程中的基础内容,分别是missing value handling和categorical data encoding的一些 ...
- Auto-ML之自动化特征工程
1. 引言 个人以为,机器学习是朝着更高的易用性.更低的技术门槛.更敏捷的开发成本的方向去发展,且Auto-ML或者Auto-DL的发展无疑是最好的证明.因此花费一些时间学习了解了Auto-ML领域的 ...
- 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)
本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26 ...
- Kaggle:Home Credit Default Risk 特征工程构建及可视化(2)
博主在之前的博客 Kaggle:Home Credit Default Risk 数据探索及可视化(1) 中介绍了 Home Credit Default Risk 竞赛中一个优秀 kernel 关于 ...
- python 机器学习库 —— featuretools(自动特征工程)
文档:https://docs.featuretools.com/#minute-quick-start 所谓自动特征工程,即是将人工特征工程的过程自动化.以 featuretools 为代表的自动特 ...
- 想搞机器学习,不会特征工程?你TM逗我那!
原文:http://dataunion.org/20276.html 作者:JasonDing1354 引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而 ...
随机推荐
- iOS下UITableView的单元格重用逻辑
终于有时间继续UITableView的接口调用顺序这篇文章了,之前测试过,模拟器都是按照height,cellForRow这样的顺序调用接口的,iOS8以前一直是这样,但是到了iOS8,这个顺序倒过来 ...
- oracle中的装换函数
日期装换成字符的函数:TO_CHAR(date[,fmt[,params]]) 默认格式:DD-MON-RR 参数说明: date:将要装换的日期 fmt:装换的格式 params:日期的语言(可以不 ...
- 通过反射得到object[]数组的类型并且的到此类型所有的字段及字段的值
private string T_Account(object[] list) { StringBuilder code = new StringBuilder(); //得到数据类型 Type t ...
- javascript 中的 true 或 false
JavaScript中奇葩的假值 通常在以下语句结构中需要判断真假 if分支语句 while循环语句 for里的第二个语句 如 1 2 3 4 5 6 7 if (boo) { // do somet ...
- Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...
- Hadoop的I/O操作
HDFS的数据完整性 检验数据是否损坏最常见的措施是:在数据第一次引入系统时计算校验和并在数据通过一个不可靠通道进行传输时再次计算校验和,这样就能发现数据是否被损坏.HDFS会对写入的所有数据计算校验 ...
- 异步等待(ManualResetEvent
ManualResetEvent实现异步等待,超过时间 不做处理,继续往下执行代码 (ManualResetEvent 涉及一个线程在其他线程进行之前必须完成的任务) ManualResetEvent ...
- Qt StyleSheet样式表实例(转)
QT论坛看到的,收藏一下! 在涉及到Qt 美工的时候首先需要掌握CSS 级联样式表. 下面将通过几个例子来介绍一下怎样使用Qt中的部件类型设计.自定义的前台背景与后台背景的颜色: 如果需要一个文本编辑 ...
- Eclipse *版本
关于Eclipse的版本介绍, Eclipse Standard 该版本是eclipse最基础的版本,适合Java se个人开发者.或希望根据自己需求配置插件的开发者使用. Eclipse IDE f ...
- 建立一个简单的SpringMVC程序
首先,所建立的程序是一个web程序,所以在web.xml文件中进行如下的配置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...