使用Titanic 数据集,通过特征筛选的方法一步步提升决策树的预测性能

运行python机器学习及实践代码59会出错,本人经过调试对其进行改进,主要原因是因为python 的版本不同,我的是python3

源代码:

import pandas as pd
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')

y = titanic['survived']#将survived属性列抽取出来赋给y作为标签值
x = titanic.drop(['row.names', 'name', 'survived'], axis=1)#将row.names,names,survived三列去掉,不作为属性特征
x.info()

x['age'].fillna(x['age'].mean(), inplace=True)#age属性列有些值缺少了,采用这一属性的其他值的平均值来进行填充
x.fillna('UNKNOWN', inplace=True)#对于其他属性值的缺少,全部用unknown来填充

from sklearn.model_selection 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)
print(dt.score(x_test, y_test))

#从sklearn导入特征筛选器
from sklearn import feature_selection
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)
print(dt.score(x_test_fs, y_test))


from sklearn.model_selection 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)
运行源代码会出现如下错误:

Traceback (most recent call last):
  File "D:/Python362/a_机器学习及实战/features_choose.py", line 51, in <module>
    print('Optimal number of features %d'%percentiles[opt])
TypeError: only integer scalar arrays can be converted to a scalar index
经过多次调试错误代码锁定在opt = np.where(results == results.max())[0]上,一下代码是本人对其进行修改并注释的代码:

import pandas as pd
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')

y = titanic['survived']#将survived属性列抽取出来赋给y作为标签值
x = titanic.drop(['row.names', 'name', 'survived'], axis=1)#将row.names,names,survived三列去掉,不作为属性特征
x.info()

x['age'].fillna(x['age'].mean(), inplace=True)#age属性列有些值缺少了,采用这一属性的其他值的平均值来进行填充
x.fillna('UNKNOWN', inplace=True)#对于其他属性值的缺少,全部用unknown来填充

from sklearn.model_selection 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)
print(dt.score(x_test, y_test))

#从sklearn导入特征筛选器
from sklearn import feature_selection
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)
print(dt.score(x_test_fs, y_test))


from sklearn.model_selection 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)
#print(results.max())
#print(results == results.max())调试所用

print(np.where(results == results.max()))#返回的是一个(array([3], dtype=int64),)元组形式的数据,我们需要的是这个results.max的索引,3正是索引,
#我们就要想办法把3提取出来,可以看出[3]是一个array也就是矩阵形式的,那么3所在的位置是一行一列,所以在下一步骤做相应的提取
opt = np.where(results == results.max())[0][0]#这一句跟源代码有出入,查看文档np.where返回的是 ndarray or tuple of ndarrays类型数据

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)

最终定位结果如下:
<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
474
0.814589665653
0.817629179331
[ 0.85063904  0.85673057  0.87602556  0.88622964  0.86691404  0.86896516
  0.86691404  0.87404659  0.86692435  0.86997526  0.86694496  0.86795506
  0.86692435  0.86791383  0.85981241  0.86284271  0.86791383  0.86487322
  0.86690373  0.858792    0.86588332  0.86386312  0.87302618  0.86691404
  0.86489384  0.86791383  0.87098536  0.87199546  0.86690373  0.87202639
  0.87300557  0.87201608  0.86791383  0.87198516  0.86996496  0.87402597
  0.86996496  0.86894455  0.86691404  0.86688312  0.86692435  0.87198516
  0.86184292  0.86284271  0.8598021   0.8597918   0.86491445  0.85981241
  0.86285302  0.85876108]
Optimal number of features 7
效果图如下:



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
决策树(Decision Tree)是一种基于树状结构的机器学习算法,可用于解决二分类问题。在Titanic数据集中,我们可以使用决策树来预测乘客是否生还。 决策树通过逐步分割数据的特征,将数据分为不同的类别。为了构建决策树模型,我们需要选择一个合适的特征作为根节点,在Titanic数据集中,例如"性别"、"年龄"等特征可以作为根节点。根据不同特征的取值,递归地划分数据,并生成一个树状结构。最终我们可以使用这个决策树来对新的乘客进行生还预测。 神经网络(Neural Network)是一种模拟人脑神经元的计算模型,也可以用于二分类问题。在Titanic数据集中,我们可以通过训练神经网络来预测乘客是否生还。 神经网络由输入层、隐藏层和输出层组成。输入层接收Titanic数据集中的特征,隐藏层根据权重和激活函数进行计算,输出层产生二分类的预测结果。通过反向传播算法,我们可以调整网络中的权重和偏差,以最小化预测错误。 逻辑回归(Logistic Regression)是用于解决二分类问题的广义线性回归模型。在Titanic数据集中,我们可以使用逻辑回归来预测乘客是否生还。 逻辑回归通过使用逻辑函数(也称为Sigmoid函数)将线性回归结果映射到0到1之间的概率值。对于Titanic数据集中的每个特征,我们可以使用逻辑回归建立一个模型,该模型可以根据乘客的特征值来预测其生还概率。 以上三种方法都可以用于解决Titanic数据集中的二分类问题。根据实际情况,我们可以根据特征的不同选择合适的算法,并根据模型的性能进行调整和优化,以提高预测的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值