基于sklearn的特征筛选理论代码实现

理论

特征筛选的作用

样本中的有些特征是所谓的“优秀特征”,使用这些特征可以显著的提高泛化能力。而有些特征在样本类别区分上并不明显,在训练中引入这些特征会导致算力的浪费;另外有些特征对样本的分类有反作用,引入这些特征反而会导致泛化能力下降

特征筛选

与PCA(主成分分析)不同,特征筛选不修改特征值,而是寻找对模型性能提升较大的尽量少的特征

代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

引入数据集——Titanic数据集

titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
titan.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 11 columns):
row.names    1313 non-null int64
pclass       1313 non-null object
survived     1313 non-null int64
name         1313 non-null object
age          633 non-null float64
embarked     821 non-null object
home.dest    754 non-null object
room         77 non-null object
ticket       69 non-null object
boat         347 non-null object
sex          1313 non-null object
dtypes: float64(1), int64(2), object(8)
memory usage: 112.9+ KB

数据预处理

分离数据与标签

x_source = titan.drop(["row.names","name","survived"],axis=1)
x_source.info()
y_source = titan["survived"]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 8 columns):
pclass       1313 non-null object
age          633 non-null float64
embarked     821 non-null object
home.dest    754 non-null object
room         77 non-null object
ticket       69 non-null object
boat         347 non-null object
sex          1313 non-null object
dtypes: float64(1), object(7)
memory usage: 82.1+ KB

缺失数据填充

x_source['age'].fillna(x_source['age'].mean(),inplace=True)
x_source.fillna('UNKNOWN',inplace=True)
x_source.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 8 columns):
pclass       1313 non-null object
age          1313 non-null float64
embarked     1313 non-null object
home.dest    1313 non-null object
room         1313 non-null object
ticket       1313 non-null object
boat         1313 non-null object
sex          1313 non-null object
dtypes: float64(1), object(7)
memory usage: 82.1+ KB

数据分割

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x_source,y_source,random_state=33,test_size=0.25)
x_train.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 984 entries, 1086 to 1044
Data columns (total 8 columns):
pclass       984 non-null object
age          984 non-null float64
embarked     984 non-null object
home.dest    984 non-null object
room         984 non-null object
ticket       984 non-null object
boat         984 non-null object
sex          984 non-null object
dtypes: float64(1), object(7)
memory usage: 69.2+ KB

特征向量化

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'))
len(vec.feature_names_)
474

模型训练

from sklearn.tree import DecisionTreeClassifier

基本决策树模型

dt = DecisionTreeClassifier(criterion='entropy')
dt.fit(x_train,y_train)
dt.score(x_test,y_test)
0.82066869300911849

带特征筛选的决策树

from sklearn import feature_selection
fs = feature_selection.SelectPercentile(feature_selection.chi2,percentile=7)
x_train_fs = fs.fit_transform(x_train,y_train)
x_test_fs = fs.transform(x_test)
print(x_train.shape,x_train_fs.shape)
(984, 474) (984, 33)
dt.fit(x_train_fs,y_train)
dt.score(x_test_fs,y_test)
0.85410334346504557

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

为什么XGBoost在机器学习竞赛中表现如此卓越?

28550
来自专栏AI科技评论

干货 | CVPR 2018论文:「随心所欲」换装换姿态

本文作者 Liqian Ma,他为 AI 科技评论撰写了他作为第一作者被 CVPR 2018 录用的 Spotlight 论文解读稿件。

16030
来自专栏Data Analysis & Viz

Text-CNN、Word2Vec、RNN、NLP、Keras、fast.ai-20180504

本文集仅为收录自己感兴趣、感觉不错的文章与资源,方便日后查找和阅读,所以排版可能会让人觉得乱。内容会不断更新与调整。文中涉及公众号的文章链接可以会失效,知道如何...

30920
来自专栏PPV课数据科学社区

贝叶斯、概率分布与机器学习

一. 简单的说贝叶斯定理: 贝叶斯定理用数学的方法来解释生活中大家都知道的常识 形式最简单的定理往往是最好的定理,比如说中心极限定理,这样的定理往往会成为某一个...

397100
来自专栏专知

【干货】基于注意力机制的神经匹配模型用于短文本检索

【导读】在基于检索的问答系统中,很重要的一步是将检索到的答案进行排序得到最佳的答案。在检索到的答案比较短时,对答案进行排序也成为了一个难题。使用深度学习的方法,...

90580
来自专栏AI2ML人工智能to机器学习

最小二乘法的6个假设 (上篇)

我们曾经在“一步一步走向锥规划 - LS”里面详细介绍了最小二乘法的由来和几何解释。 并且, 在“回归分析中的问题和修正的探讨”中谈到了经典最小二乘法OLS的局...

44520
来自专栏JasonhavenDai

统计学习方法之朴素贝叶斯1.概述2.基础知识3.基本方法4.参数估计5.简单实现

1.概述 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验概率计...

41480
来自专栏自学笔记

机器学习可行性与VC dimension

在银行评估贷款申请人的授信请求前,会进行风险评估。符合申请则通过,反之驳回。长时间的数据和申请使得银行从中找到了一些规律并开始learning,所以风险评估就是...

38340
来自专栏个人分享

总体参数的估计(概念)

举例:到底北京人同意北京大力发展轨道交通,由于不大可能询问所有的一千多万北京市民,人们只好进行抽样调查以得到样本,并用样本中同意发展轨道交通的比例来估计真实的比...

15220
来自专栏机器学习算法工程师

《机器学习》笔记-聚类(9)

17950

扫码关注云+社区

领取腾讯云代金券