2015-10-18 81 views
1

我有一個包含100000行和129列的數據集。我使用pandas將其加載到數據框中,並將該組分爲2個子集:訓練(70%)父集和測試(30%)。這是我用於拆分的代碼Scikit學習 - 測試集上的高精度

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%準確性的原因,但一個增強可能是使用熊貓命名的字段,而不是使用'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。但是與您的數據集大小(100k樣本)相比,20幾乎沒有任何區別。

如果你想構建更多受限制的(廣義)樹 - 你可以玩max_depth,min_samples_split(增加它),min_samples_leaf,etc