zoukankan      html  css  js  c++  java
  • 特征工程-机器学习

        最近,在公司实习的时候参加了一个项目,主要负责特征工程部分的工作。具体内容不方便写出来,这里只是将项目中涉及到的解决办法、思路等作为笔记记录下来。

    一、第一阶段(项目负责人(大神)扔给了一堆数据,让简单跑个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了。(当然,以上只是自己一个月以来大粒度做的一点工作,后面项目还需要仔细规划,认真分析每一个特征,准确构建模型)

    二、第二阶段(待完善)

  • 相关阅读:
    120. Triangle
    Effective C++ 条款36 绝不重新定义继承而来的non-virtual函数
    Effective C++ 条款31 将文件中间的编译依存关系降至最低
    Effective C++ 条款35 考虑virtual函数以外的其他选择
    Effective C++ 条款34 区分接口继承和实现继承
    Effective C++ 条款33 避免遮掩继承而来的名称
    Effective C++ 条款32 确定你的public继承塑模出is-a关系
    Effective C++ 条款30 透彻了解inlining的里里外外
    Effective C++ 条款29 为"异常安全"而努力是值得的
    Effective C++ 条款28 避免返回handles指向对象内部成分
  • 原文地址:https://www.cnblogs.com/ArleneZhangfj/p/10655477.html
Copyright © 2011-2022 走看看