• 机器学习之路: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()

    生成的准确率图:

  • 相关阅读:
    CentOS中rpm和yum到底有什么区别?
    Anaconda是个什么东东?
    Hadoop入门学习整理(三)
    Hadoop入门学习整理(二)
    CentOS6.10下安装MongoDB和Redis
    Linux 系统中环境变量/etc/profile、/etc/bashrc、~/.bashrc的区别
    一些想法
    时间
    周末
    条件
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/8974439.html
Copyright © 2020-2023  润新知