zoukankan      html  css  js  c++  java
  • 机器学习中的特征选择——决策树模型预测泰坦尼克号乘客获救实例

    机器学习统计学中,特征选择英语:feature selection)也被称为变量选择属性选择变量子集选择。它是指:为了构建   模型而选择相关特征(即属性、指标)子集的过程。使用特征选择技术有三个原因:

    • 简化模型,使之更易于被研究人员或用户理解,
    • 缩短训练时间,
    • 改善通用性、降低过拟合(即降低方差)。

    本文以之前决策树预测中的泰坦尼克号数据为例,试图通过特征筛选来选择最佳的特征组合,并且提到预测准确性的目标。
    机器学习之决策树预测——泰坦尼克号乘客数据实例可参考我之前的博客:点击打开链接

    代码如下:

    # 导入pandas并且更名为pd。
    import pandas as pd
    # 从互联网读取titanic数据。
    titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
    
    
    # 分离数据特征与预测目标。
    y = titanic['survived']
    X = titanic.drop(['row.names', 'name', 'survived'], axis = 1)
    
    
    # 对对缺失数据进行填充。
    X['age'].fillna(X['age'].mean(), inplace=True)
    X.fillna('UNKNOWN', inplace=True)
    
    
    # 分割数据,采样25%用于测试。
    from sklearn.cross_validation import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)
    
    
    # 类别型特征向量化。
    from sklearn.feature_extraction import DictVectorizer
    vec = DictVectorizer()
    X_train = vec.fit_transform(X_train.to_dict(orient='record'))
    X_test = vec.transform(X_test.to_dict(orient='record'))
    
    
    # 输出处理后特征向量的维度。
    print (len(vec.feature_names_))
    
    
    
    # 使用决策树模型依靠所有特征进行预测,并作性能评估。
    from sklearn.tree import DecisionTreeClassifier
    dt = DecisionTreeClassifier(criterion='entropy')
    dt.fit(X_train, y_train)
    dt.score(X_test, y_test)
    
    0.81762917933130697

    # 从sklearn导入特征筛选器。
    from sklearn import feature_selection
    # 筛选前20%的特征,使用相同配置的决策树模型进行预测,并且评估性能。
    fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=20)
    X_train_fs = fs.fit_transform(X_train, y_train)
    dt.fit(X_train_fs, y_train)
    X_test_fs = fs.transform(X_test)
    dt.score(X_test_fs, y_test)
    0.82370820668693012

    # 通过交叉验证的方法,按照固定间隔的百分比筛选特征,并作图展示性能随特征筛选比例的变化。
    from sklearn.cross_validation import cross_val_score
    import numpy as np
    
    percentiles = range(1, 100, 2)
    results = []
    
    for i in percentiles:
        fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile = i)
        X_train_fs = fs.fit_transform(X_train, y_train)
        scores = cross_val_score(dt, X_train_fs, y_train, cv=5)
        results = np.append(results, scores.mean())
    print results
    
    # 找到体现最佳性能的特征筛选的百分比。
    opt = np.where(results == results.max())[0]
    print ('Optimal number of features %d' %percentiles[opt])
    import pylab as pl
    pl.plot(percentiles, results)
    pl.xlabel('percentiles of features')
    pl.ylabel('accuracy')
    pl.show()
    # 使用最佳筛选后的特征,利用相同配置的模型在测试集上进行性能评估。
    from sklearn import feature_selection
    fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=7)
    X_train_fs = fs.fit_transform(X_train, y_train)
    dt.fit(X_train_fs, y_train)
    X_test_fs = fs.transform(X_test)
    dt.score(X_test_fs, y_test)

    0.8571428571428571

    对上述输出作总结,可以发现:
    (1)初步处理特征后,训练与测试数据均有474个维度的特征
    (2)全部维度用于训练模型,测试集准确性约为81.76%
    (3)筛选前20%维度特征,相同模型配置下预测,测试集表现的准确性为82.37%
    (4)如果按照固定的间隔采用不同的百分比的特征进行训练与测试,通过交叉验证得出的准确性有很大的波动,最好的模型的性能表现在选取7%维度的特征的时候


    参考文献:
    https://zh.wikipedia.org/zh-hans/%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9
     Python机器学习及实践——从零开始通往Kaggle竞赛之路
  • 相关阅读:
    【leetcode】1630. Arithmetic Subarrays
    【leetcode】1629. Slowest Key
    【leetcode】1624. Largest Substring Between Two Equal Characters
    【leetcode】1620. Coordinate With Maximum Network Quality
    【leetcode】1619. Mean of Array After Removing Some Elements
    【leetcode】1609. Even Odd Tree
    【leetcode】1608. Special Array With X Elements Greater Than or Equal X
    【leetcode】1603. Design Parking System
    【leetcode】1598. Crawler Log Folder
    Java基础加强总结(三)——代理(Proxy)Java实现Ip代理池
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411658.html
Copyright © 2011-2022 走看看