1. 程式人生 > >TypeError: __init__() got multiple values for argument 'shuffle'

TypeError: __init__() got multiple values for argument 'shuffle'

以下銀行卡詐騙專案中的一段程式碼:

from sklearn.cross_validation import KFold
def printing_Kfold_scores(x_train_data,y_train_data):
     fold =KFold(len(y_train_data),5,shuffle=False) 
     for iteration, indices in enumerate(fold,start=1):
         lr = LogisticRegression(C = c_param,penalty = 'l1')   
         lr.fit(x_train_data.iloc[indices[0],:],y_train_data.iloc[indices[0],:].values.ravel())
         y_pred_undersample =lr.predict(x_train_data.iloc[indices[1],:].values)
         recall_acc =recall_score(y_train_data.iloc[indices[1],:].values,y_pred_undersample)
         recall_accs.append(recall_acc)

以上這段程式碼本身是沒有問題的,但由於庫版本的原因,有的人在執行這段程式碼後,出現以下錯誤:

ModuleNotFoundError: No module named 'sklearn.cross_validation'

為此他將from sklearn.cross_validation import KFold改為from sklearn.model_selection import KFold,再執行卻發現有了新的問題:

TypeError: __init__() got multiple values for argument 'shuffle'

這是為什麼呢?其實這是匯入 KFold的方式不同引起的。如果你這樣做:from sklearn.cross_validation import KFold,那麼:

KFold(n,5,shuffle=False)  # n為總數,需要傳入三個引數

但如果你這樣做:from sklearn.model_selection import KFold,那麼:

fold = KFold(5,shuffle=False)  # 無需傳入n

正確程式碼如下:

from sklearn.model_selection import KFold
def printing_Kfold_scores(x_train_data,y_train_data):
    fold = KFold(5,shuffle=False) 
    recall_accs = []
    for iteration, indices in enumerate(fold.split(x_train_data)): 
        lr = LogisticRegression(C = c_param, penalty = 'l1')   
        lr.fit(x_train_data.iloc[indices[0],:],y_train_data.iloc[indices[0],:].values.ravel())  
        y_pred_undersample = lr.predict(x_train_data.iloc[indices[1],:].values)  
        recall_acc = recall_score(y_train_data.iloc[indices[1],:].values,y_pred_undersample) 
        recall_accs.append(recall_acc)

所以,匯入庫方式不同,會導致傳入引數有所不同,一定要注意。