2015-10-18 4 views
1

У меня есть набор данных, содержащий 100000 строк и 129 столбцов. Я использую pandas, чтобы загрузить его в фрейм данных и разбить набор на 2 подмножества: обучение (70%) родительского набора и тестирование (30%). Это код, который я использовал для расщепленияScikit learn - Высокая точность на тестовом наборе

def makeSample(df): 
    test_size = len(df.index) * 30/100 
    rows = random.sample(df.index, test_size) 

    testing = df.ix[rows] 
    training = df.drop(rows) 

    print "Number of testing set %s\n" % len(testing.index) 
    print "Number of training set %s\n" % len(training.index) 

    return training, testing 

def split9Folds(df): 
    for x in xrange(1, 10): 
    training, testing = makeSample(df) 

    training.to_csv(r'split/training_%s.csv' % x, header=None, index=None, sep=',', mode='w') 
    testing.to_csv(r'split/testing_%s.csv' % x, header=None, index=None, sep=',', mode='w') 

Процесс расщепления будет выполнен в 9 раз. В целом, у меня есть 9 пар учебного/тестового файла. Затем я использую дерево решений от Scikit-learn обучать

df_file = "split/training_9.csv" 
df = pd.read_csv(df_file, sep=',', header=None) 
df.columns = xrange(1, len(df.columns) + 1) 

## remove the id column 
df.drop(df.columns[[4]], axis=1, inplace=True) 

## remove the class column 
features_column = list(df.columns[1:]) 
target_column = list(df.columns[0:1]) 

tr_features_list = df[features_column] 
tr_target_list = df[target_column] 

clf = tree.DecisionTreeClassifier(min_samples_split=20, random_state=99) 
clf = clf.fit(tr_features_list, tr_target_list) 

И затем использовать файл тестирования с целью проверки точности. Что удивило меня, когда тестирование счет точности всегда 1 (точность 100%)

t_file = "split/testing_9.csv" 
t_df = pd.read_csv(t_file, sep=',', header=None) 
t_df.columns = xrange(1, len(t_df.columns) + 1) 
t_df.drop(t_df.columns[[4]], axis=1, inplace=True) 

t_features_list = t_df[features_column] 
t_target_list = t_df[target_column] 

score = clf.score(t_features_list, t_target_list) 

print score 

Посмотрите, как я с переобучения проблемы или другие проблемы в процессе обучения. Это происходит и со всеми наборами тестов. Можете ли вы дать мне несколько советов по этому поводу?

+0

Не уверен, что вы получаете 100% -ную точность, но одним из усовершенствований может быть использование полей с именами pandas вместо использования 'df.columns'. Это делает вещи более ясными и менее подвержен ошибкам, чем индексирование на основе целых чисел. – ldirer

+0

@ldirer: Да, я согласился. Проблема заключается в том, что набор данных не имеет ни одного столбца с именем (набор данных KDD cup 2008). Таким образом, я просто позволю туда –

+0

Хорошо. Я бы по-прежнему использовал целочисленный индекс, а не атрибут столбцов. По умолчанию при загрузке вашего фрейма вы получаете целые имена для полей. В частности, эта часть выглядит странно для меня: 't_df.columns = xrange (1, len (t_df.columns) + 1)'. Когда вы используете 'drop' на следующей строке, поле, которое вы выпадаете, основано на индексе, а не на атрибуте df.columns. Не уверен, что это то, что вы намеревались. – ldirer

ответ

0

Возможно, вы путаете концепции DecisionTree (дерево с одним решением) и некоторые мета-оценки ансамбля (многие классификаторы, такие как DecisionTree). Я не вижу ничего плохого в ваших результатах. Без каких-либо ограничений дерево решений может всегда отлично отделяет ваш набор данных. Потому что он может аппроксимировать любую границу решения. Это то, что происходит в вашем случае. Единственное ограничение на DecisonTree, которое у вас есть - min_samples_split=20. Но 20 практически ничего не сравнивают с вашим размером набора данных (образцы 100 тыс. Экземпляров).

Если вы хотите создать более ограниченное (обобщенное) дерево - вы можете играть с max_depth, min_samples_split (увеличить его), min_samples_leaf, etc.

Смежные вопросы