您的位置:首页 > 编程语言 > Python开发

python中使用超参数估计法结合特征筛选的方法提升决策树的预测性能

2018-02-12 20:15 861 查看
import pandas as pd
titanic = pd.read_csv('../Datasets/Breast-Cancer/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)

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)
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.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 feature %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)
print(dt.score(X_test_fs,y_test))
运行结果如下:
Traceback (most recent call last):
File "D:\Python35\demo\titanic_select.py", line 2, in <module>
titanic = pd.read_csv('../Datasets/Breast-Cancer/titanic.txt')
File "D:\Python35\lib\site-packages\pandas\io\parsers.py", line 709, in parser_f
return _read(filepath_or_buffer, kwds)
File "D:\Python35\lib\site-packages\pandas\io\parsers.py", line 449, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "D:\Python35\lib\site-packages\pandas\io\parsers.py", line 818, in __init__
self._make_engine(self.engine)
File "D:\Python35\lib\site-packages\pandas\io\parsers.py", line 1049, in _make_engine
self._engine = CParserWrapper(self.f, **self.options)
File "D:\Python35\lib\site-packages\pandas\io\parsers.py", line 1695, in __init__
self._reader = parsers.TextReader(src, **kwds)
File "pandas\_libs\parsers.pyx", line 402, in pandas._libs.parsers.TextReader.__cinit__
File "pandas\_libs\parsers.pyx", line 718, in pandas._libs.parsers.TextReader._setup_parser_source
FileNotFoundError: File b'../Datasets/Breast-Cancer/titanic.txt' does not exist
>>>
提示找不到相应的数据集,导入数据集,运行结果如下:474
0.8267477203647416
0.8206686930091185
[0.85063904 0.85673057 0.87501546 0.88622964 0.86692435 0.87403628
0.87302618 0.86998557 0.86691404 0.87200577 0.86894455 0.86795506
0.86692435 0.86691404 0.86285302 0.86689342 0.86083282 0.86387343
0.86694496 0.8608122 0.86284271 0.86284271 0.86487322 0.86388374
0.86997526 0.86896516 0.86894455 0.86589363 0.87200577 0.86690373
0.86588332 0.86996496 0.86996496 0.86588332 0.87404659 0.86994434
0.86488353 0.87100598 0.87201608 0.86993403 0.87199546 0.86994434
0.8608122 0.86591424 0.85878169 0.86589363 0.86388374 0.8618223
0.8598021 0.85981241]
超参数预估结果曲线图如下:



从图示中可以看出,当超参数调整为7时,预估精度达到最高,相应的预估精度结果如下:Optimal accuarcy of feature is
0.8571428571428571
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐