zoukankan      html  css  js  c++  java
  • 机器学习之路:python 特征降维 特征筛选 feature_selection

    特征提取:
    特征降维的手段
    抛弃对结果没有联系的特征
    抛弃对结果联系较少的特征
    以这种方式,降低维度

    数据集的特征过多,有些对结果没有任何关系,
    这个时候,将没有关系的特征删除,反而能获得更好的预测结果

    下面使用决策树,预测泰坦尼克号幸存情况,
    对不同百分比的筛选特征,进行学习和预测,比较准确率

    python3学习使用api

    使用到联网的数据集,我已经下载到本地,可以到我的git中下载数据集

    git: https://github.com/linyi0604/MachineLearning

    代码:

     1 import pandas as pd
     2 from sklearn.cross_validation import train_test_split
     3 from sklearn.feature_extraction import DictVectorizer
     4 from sklearn.tree import DecisionTreeClassifier
     5 from sklearn import feature_selection
     6 from sklearn.cross_validation import cross_val_score
     7 import numpy as np
     8 import pylab as pl
     9 
    10 '''
    11 特征提取:
    12     特征降维的手段
    13     抛弃对结果没有联系的特征
    14     抛弃对结果联系较少的特征
    15     以这种方式,降低维度
    16     
    17 数据集的特征过多,有些对结果没有任何关系,
    18 这个时候,将没有关系的特征删除,反而能获得更好的预测结果
    19 
    20 下面使用决策树,预测泰坦尼克号幸存情况,
    21 对不同百分比的筛选特征,进行学习和预测,比较准确率
    22 '''
    23 
    24 # 1 准备数据
    25 titanic = pd.read_csv("../data/titanic/titanic.txt")
    26 # 分离数据特征与目标
    27 y = titanic["survived"]
    28 x = titanic.drop(["row.names", "name", "survived"], axis=1)
    29 # 对缺失值进行补充
    30 x['age'].fillna(x['age'].mean(), inplace=True)
    31 x.fillna("UNKNOWN", inplace=True)
    32 
    33 # 2 分割数据集 25%用于测试 75%用于训练
    34 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=33)
    35 
    36 # 3 类别型特征向量化
    37 vec = DictVectorizer()
    38 x_train = vec.fit_transform(x_train.to_dict(orient='record'))
    39 x_test = vec.transform(x_test.to_dict(orient='record'))
    40 # 输出处理后向量的维度
    41 # print(len(vec.feature_names_))  # 474
    42 
    43 # 4 使用决策树对所有特征进行学习和预测
    44 dt = DecisionTreeClassifier(criterion='entropy')
    45 dt.fit(x_train, y_train)
    46 print("全部维度的预测准确率:", dt.score(x_test, y_test))  # 0.8206686930091185
    47 
    48 # 5 筛选前20%的特征,使用相同配置的决策树模型进行评估性能
    49 fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=20)
    50 x_train_fs = fs.fit_transform(x_train, y_train)
    51 x_test_fs = fs.transform(x_test)
    52 dt.fit(x_train_fs, y_train)
    53 print("前20%特征的学习模型预测准确率:", dt.score(x_test_fs, y_test))     # 0.8237082066869301
    54 
    55 # 6 通过交叉验证 按照固定间隔百分比筛选特征, 展示性能情况
    56 percentiles = range(1, 100, 2)
    57 results = []
    58 for i in percentiles:
    59     fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=i)
    60     x_train_fs = fs.fit_transform(x_train, y_train)
    61     scores = cross_val_score(dt, x_train_fs, y_train, cv=5)
    62     results = np.append(results, scores.mean())
    63 # print(results)
    64 '''
    65 [0.85063904 0.85673057 0.87501546 0.88622964 0.86284271 0.86489384
    66  0.87303649 0.86689342 0.87098536 0.86690373 0.86895485 0.86083282
    67  0.86691404 0.86488353 0.86895485 0.86792414 0.86284271 0.86995465
    68  0.86486291 0.86385281 0.86384251 0.86894455 0.86794475 0.86690373
    69  0.86488353 0.86489384 0.86590394 0.87300557 0.86995465 0.86793445
    70  0.87097506 0.86998557 0.86692435 0.86892393 0.86997526 0.87098536
    71  0.87198516 0.86691404 0.86691404 0.87301587 0.87202639 0.8648423
    72  0.86386312 0.86388374 0.86794475 0.8618223  0.85877139 0.86285302
    73  0.86692435 0.8577819 ]
    74 '''
    75 # 找到最佳性能的筛选百分比
    76 opt = np.where(results == results.max())[0][0]
    77 print("最高性能的筛选百分比是:%s%%" % percentiles[opt])  # 7
    78 
    79 pl.plot(percentiles, results)
    80 pl.xlabel("特征筛选的百分比")
    81 pl.ylabel("准确率")
    82 pl.show()

    生成的准确率图:

  • 相关阅读:
    html文件引用本地js文件出现跨域问题的解决方案
    【移动端】cordova 更改app的图标、名字、加载画面以及强制横竖屏
    thinkphp5.0返回插入数据id
    ThinkPHP5 隐藏index.php问题
    密码强度正则表达式 – 必须包含大写字母,小写字母和数字,至少8个字符等
    php实现微信分享朋友圈
    HTML Input 表单校验之datatype
    TP5:使用了INPUT函数来接收参数了,还需再过滤SQL注入吗
    大商创微信公众号微信支付失败报错
    $GLOBALS — 引用全局作用域中可用的全部变量
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/8974439.html
Copyright © 2011-2022 走看看