2015-10-06 38 views
0

我嘗試使用Scikit在Python中學習來創建預測模型。我有一個約850k行和17列的數據框。最後一列是我的標籤,其他是我的功能。Scikit在CrossValidation上沒有足夠的摺疊學習

from sklearn import cross_validation 
from sklearn.ensemble import RandomForestClassifier 
from sklearn import metrics 

predictors = [a list of my predictors columns] 

alg = RandomForestClassifier(random_state=1, n_estimators=150, min_samples_split=8, min_samples_leaf=4) 

scores = cross_validation.cross_val_score(alg, train[predictors],train["Sales"], cv=5) 

print(scores.mean()) 

然而,當我運行代碼,我有以下警告:

/Users/.../anaconda/lib/python2.7/site-packages/sklearn/cross_validation.py:417: Warning: The least populated class in y has only 1 members, which is too few. The minimum number of labels for any class cannot be less than n_folds=5. 
    % (min_labels, self.n_folds)), Warning) 

我不知道如果我的理解警告消息。我以爲我只會用小樣本。

+0

問題在於目標中類的稀疏性。 'y'中班級的頻率是多少? – David

+0

@David不知道我是否理解得很好,但train [「Sales」]是一個從0到10.000的整數列,出現了許多不同的情況。所以,如果你的意思是目標有重複的價值。 – Tasos

+1

所以這聽起來像是你預測了一個與分類變量相反的連續變量,對嗎?如果是這樣,你應該使用迴歸而不是分類,即:'RandomForestRegressor' – David

回答

0

正如David在評論中所建議的那樣,聽起來您的輸出是連續的而不是絕對的。如果是這樣的話,你幾乎肯定不想進行分類,而不是迴歸。

該警告源於您的目標中的(至少)其中一個值被視爲分類的事實不足。如果您確實想要執行分類,首先要做的一件好事是計算整個培訓集中每個班級的出現次數。

當你k倍交叉驗證,和min_labels < k,交叉驗證的運行中的一個是不能保證看到類的任何例子與min_labels,無論是在列車或測試時間(更經常發生在測試時間,因爲測試集較小)。如果您只有一個特定班級的實例,那麼您將保證獲得培訓運行,但沒有看到該班級的任何示例(它位於其中一個摺疊中,這將是用作測試集一次)