У меня есть набор данных, содержащий 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
Посмотрите, как я с переобучения проблемы или другие проблемы в процессе обучения. Это происходит и со всеми наборами тестов. Можете ли вы дать мне несколько советов по этому поводу?
Не уверен, что вы получаете 100% -ную точность, но одним из усовершенствований может быть использование полей с именами pandas вместо использования 'df.columns'. Это делает вещи более ясными и менее подвержен ошибкам, чем индексирование на основе целых чисел. – ldirer
@ldirer: Да, я согласился. Проблема заключается в том, что набор данных не имеет ни одного столбца с именем (набор данных KDD cup 2008). Таким образом, я просто позволю туда –
Хорошо. Я бы по-прежнему использовал целочисленный индекс, а не атрибут столбцов. По умолчанию при загрузке вашего фрейма вы получаете целые имена для полей. В частности, эта часть выглядит странно для меня: 't_df.columns = xrange (1, len (t_df.columns) + 1)'. Когда вы используете 'drop' на следующей строке, поле, которое вы выпадаете, основано на индексе, а не на атрибуте df.columns. Не уверен, что это то, что вы намеревались. – ldirer