最近,在公司实习的时候参加了一个项目,主要负责特征工程部分的工作。具体内容不方便写出来,这里只是将项目中涉及到的解决办法、思路等作为笔记记录下来。
一、第一阶段(项目负责人(大神)扔给了一堆数据,让简单跑个demo,看看效果,主要用的python,涉及的库有pandas、numpy、matplotlib、sklearn等等)
涉及到的数据主要分为两部分:1.有标签的正负样本;2.没有标签的样本。主要是特征工程的工作,当然数据是直接从数据库拉出来的(各种结构的数据都有)。
1.数据字典分析
对数据库中所有字段进行分析,熟悉可以利用的属性。
2.特征选择
根据项目需求,从所有属性中筛选出有用的特征(没有什么项目经验,只是去掉了严重不相关的属性,大部分选择保留,后面根据模型效果再选择)
3.数据预处理
由于数据比较脏、部分属性缺失值比例大,而且属性结构各不相同,所以针对每一个属性分别采取不同的处理方法,主要处理方法有:
a.OneHot编码
string类型的特征很多,但是有些string类型的属性就只有几个值(比如性别:只有男、女两个数值),因此采用OneHot编码转换为离散数值类型。
1 #1:one-hot编码 2 # integer encode 3 label_encoder = LabelEncoder() 4 integer_value1 = label_encoder.fit_transform(data['company_org_type'].astype(str)) 5 # binary encode 6 onehot_encoder = OneHotEncoder(sparse=False) 7 integer_value1 = integer_value1.reshape(len(integer_value1), 1) 8 onehot_value1 = pd.DataFrame(onehot_encoder.fit_transform(integer_value1))
b.特征挖掘(具体我也不知道起什么名字~~~)
通过已知信息,可以生成新的有用特征。(比如,通过学生的所属省份,可以统计出这所学校的某个省份有多少学生;通过若干年的记录,就可以大致了解考上该学校来自这个省份的学生的变化情况,这里只是简单举个例子,并不是项目涉及的内容)
c.正则化(很重要)
在一个项目中,不可能所有的特征都是数值型的,而且很多需要的数字都是嵌入在文字、字符中,或者是文本和数字的结合,这时候,正则化就起到很重要的作用。
1 amount1 = data['capital'].str.split(':').str[1] 2 data['capital'] = amount1.str.split('万').str[0] 3 data['capital'] = data['capital'] .replace(['?','货币'],[-1,-1],inplace = True) 4 data['capital'] = data['capital'] .astype('float')
我在这里用的比较多的是split和replace,因为是string类型,后面肯定还要astype()强制类型转换;
pyhton有很多好用的正则化函数,以后学习的过程中再做总结补充。
c.数据填充
将各种不同结构的数据处理为int类型之后,就可以对缺失值进行填充了,针对缺失值太多的样本或者属性,采取的措施是直接删除(简单粗暴,笑哭脸。。。。。)
主要填充办法:根据属性的特点,选择合适的填充方法(特定数值填充,均值填充,众数、中位数等等),比如如果当做缺失值的话就用0值填充,这里再打个比方,并非项目中的情况,要对学生的年龄进行填充,某一届的学生年龄都差不多,可以用众数填充;如果是学生成绩填充的话,0-100都有可能,这是用平均值填充可能更合理一些,诸如此类等等。
1 data['amount'] = data['amount'].fillna(data['amount'].mean()) 2 data['investor_type'] = data['investor_type'].fillna(1) 3 data.check_count=data.check_count.fillna(data.check_count.mode()[0])
4.构建demo
因为是一个二分类,而且数据没有很明显的符合某种分布,所以就暂时用大家都认可的GBDT/XGboost来构建demo了。主要还是调的sklearn库,没有什么可以讨论的地方。用有标签的数据对模型进行了训练,GBDT有一个好处就是,通过plot_importance()方法能够得到属性的重要性,这样方便对模型进行优化,也可以对特征工程做改进,并用可视化的形式将属性的重要得分展示出来。
1 import matplotlib.pyplot as plt 2 from xgboost import plot_importance 3 fig,ax = plt.subplots(figsize = (10,15)) 4 plot_importance(clf,height=0.5,max_num_features=64,ax = ax) 5 plt.show()
最后,利用那些没有标签的数据进行测试,然后人工搜索引擎进行验证,结果还可以,证明特征可以work了。(当然,以上只是自己一个月以来大粒度做的一点工作,后面项目还需要仔细规划,认真分析每一个特征,准确构建模型)
二、第二阶段(待完善)