In [1]:
from sklearn import model_selection, tree
import graphviz
import pandas as pd
import numpy as np
import re
import pydotplus
from IPython.display import Image
from sklearn import model_selection, metrics
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
data = pd.read_csv('german.data.txt', sep=' ', header=None)
data.head()
Out[2]:
Вытащим из описания названия признаков и значения категориальных переменных.
In [3]:
with open('german.doc') as f:
description = f.readlines()
properties_names = []
properties = {}
description = map(lambda s: s.strip(), description)
for i in xrange(len(description)):
if re.match('Attr?ibute \d+', description[i]):
i += 1
properties_names += [description[i]]
match = re.match('(A\d+) : (.*)', description[i])
if match:
properties[match.group(1)] = match.group(2)
properties_names += ['Give credit']
In [4]:
data.columns = properties_names
data.replace(properties, inplace=True)
print 'число признаков =', len(data.columns) - 1
data.head()
Out[4]:
Теперь закодируем категориальные признаки, чтобы передать датасет дереву.
In [5]:
data_encode = pd.get_dummies(data)
print 'Теперь число признаков =', len(data_encode.columns) - 1
data_encode.head()
Out[5]:
Так же сделаем приведем target к классам 0 - не давать кредит, 1 - давать.
In [6]:
data_encode[u'Give credit'] = data_encode[u'Give credit'].apply(lambda x: 0 if x == 2 else 1)
y = data_encode[u'Give credit']
X = data_encode.drop((u'Give credit'), axis=1)
In [7]:
print 'Доли классов'
print '{} объектов 1-го класса'.format((y==1).sum() * 1./len(y))
print '{} объектов 0-го класса'.format((y==0).sum() * 1./len(y))
Построим дерево, получающееся при ограничении глубины не больше 2.
In [8]:
classifier = tree.DecisionTreeClassifier(max_depth=2)
classifier.fit(X, y)
dot_data = tree.export_graphviz(classifier, out_file="tree3.out",
feature_names=X.columns,
class_names=['credit', 'no credit'],
filled=True, rounded=True,
special_characters=False)
graph = pydotplus.graphviz.graph_from_dot_file("tree3.out")
Image(graph.create_png())
Out[8]:
Сначала разбиваем по размеру доходов и наличию счета. Если доходы большие или счета нет, то, если других обязательств нет - выдаем, иначе нет. В противном случае выдаем краткосрочные кредиты (меньше 22.5 месяцев).
Без ограничения
In [9]:
classifier = tree.DecisionTreeClassifier()
classifier.fit(X, y)
dot_data = tree.export_graphviz(classifier, out_file="tree.out",
feature_names=X.columns,
class_names=['credit', 'no credit'],
filled=True, rounded=True,
special_characters=False)
graph = pydotplus.graphviz.graph_from_dot_file("tree.out")
Image(graph.create_png())
Out[9]: