Python Scikit-Learn DecisionTreeClassifier.fit () выдает KeyError: 'default' - PullRequest
0 голосов
/ 26 февраля 2020

У меня небольшой набор данных, и я пытаюсь использовать sklearn для создания классификатора дерева решений. Я использую sklearn.tree.DecisionTreeClassifier в качестве модели и использую его функцию .fit () для подгонки к данным. Осматривая, я не смог найти никого, кто сталкивался с той же проблемой.

После загрузки данных в один массив и меток в другой, распечатка двух массивов (данных и меток) дает:

[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0.]
 [1. 1. 1. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [1. 1. 1. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 1. 1. 1. 1. 0. 1. 1. 1. 0. 1. 1. 0. 1. 0. 0.]
 [0. 1. 1. 1. 1. 1. 1. 1. 0. 0. 1. 0. 0. 1. 1. 0.]
 [0. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1. 0. 1. 0. 0. 0.]
 [1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 1. 1. 0. 0. 0. 0. 0. 1. 1. 1. 0. 1. 1. 1.]
 [0. 1. 1. 1. 0. 0. 0. 0. 1. 0. 1. 1. 0. 1. 0. 0.]
 [0. 1. 1. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 0.]
 [1. 0. 1. 0. 1. 0. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]]

['Alcaligenes_faecalis' 'Bacillus_circulans' 'Bacillus_megaterium'
 'Bacillus_sphaericus' 'Citrobacter_freundii' 'Enterobacter_aerogenes'
 'Escherichia_coli' 'Micrococcus_luteus' 'Proteus_mirabilis'
 'Salmonella_arizonae' 'Serratia_marcescens' 'Staphylococcus_epidermidis'
 'Staphylococcus_saprophyticus']

Я определил функцию для подбора, и я попытался удалить функцию и напрямую запустить функцию .fit ():

def decisiontree(data, labels, criterion = "gini", splitter = "default", max_depth = None): #expects *2d data and 1d labels

    model = sklearn.tree.DecisionTreeClassifier(criterion = criterion, splitter = splitter, max_depth = max_depth)
    model = model.fit(data,labels)

    return model

Затем я вызвал функцию:

model = decisiontree(data, labels)

, в этот момент возникает KeyError:

KeyError                                  Traceback (most recent call last)
<ipython-input-21-3574397ccfb6> in <module>
----> 1 model = decisiontree(data, labels)

<ipython-input-18-e85883291477> in decisiontree(data, labels, criterion, splitter, max_depth)
      2 
      3     model = sklearn.tree.DecisionTreeClassifier(criterion = criterion, splitter = splitter, max_depth = max_depth)
----> 4     model = model.fit(data,labels)
      5 
      6     return model

~/anaconda3/lib/python3.7/site-packages/sklearn/tree/_classes.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    875             sample_weight=sample_weight,
    876             check_input=check_input,
--> 877             X_idx_sorted=X_idx_sorted)
    878         return self
    879 

~/anaconda3/lib/python3.7/site-packages/sklearn/tree/_classes.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
    333         splitter = self.splitter
    334         if not isinstance(self.splitter, Splitter):
--> 335             splitter = SPLITTERS[self.splitter](criterion,
    336                                                 self.max_features_,
    337                                                 min_samples_leaf,

KeyError: 'default'

Данные хранятся в data.csv:

Alcaligenes_faecalis,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0
Bacillus_circulans,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0
Bacillus_megaterium,1,1,1,0,1,0,1,0,0,0,0,0,0,0,0,1
Bacillus_sphaericus,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0
Citrobacter_freundii,0,1,1,1,1,0,1,1,1,0,1,1,0,1,0,0
Enterobacter_aerogenes,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0
Escherichia_coli,0,1,1,1,1,1,1,1,1,0,1,0,1,0,0,0
Micrococcus_luteus,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Proteus_mirabilis,0,1,1,1,0,0,0,0,0,1,1,1,0,1,1,1
Salmonella_arizonae,0,1,1,1,0,0,0,0,1,0,1,1,0,1,0,0
Serratia_marcescens,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,1
Staphylococcus_epidermidis,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0
Staphylococcus_saprophyticus,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,0

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

нет значения default для sklearn.tree.DecisionTreeClassifier параметр разделителя, значение по умолчанию best, поэтому вы можете использовать:

def decisiontree(data, labels, criterion = "gini", splitter = "best", max_depth = None): #expects *2d data and 1d labels

    model = sklearn.tree.DecisionTreeClassifier(criterion = criterion, splitter = splitter, max_depth = max_depth)
    model = model.fit(data,labels)

    return model
1 голос
/ 26 февраля 2020

За документы , splitter должны быть либо "лучшими", либо "случайными".

...