簡體   English   中英

將(n_samples,n_features)個ndarray轉換為(n_samples,1)個向量數組,以用作sklearn SVM的訓練標簽

[英]Convert a (n_samples, n_features) ndarray to a (n_samples, 1) array of vectors to use as training labels for an sklearn SVM

我正在嘗試為正在構建的SVM模型計算ROC和AUC。 我正在遵循這個sklearn示例中的代碼。 要求之一是輸出標簽y需要二值化。 我通過創建MultiLabelBinarizer並對所有標簽進行編碼來實現這一點,效果很好。 但是,這將創建一個(n_samples,n_features)個ndarray。 classifier.fit(X, y)函數假定y.shape = (n_samples) 我想本質上將y的列“混合”在一起,以便y [0] [0]將返回整個特征向量V ,而不僅僅是V的第一個值。

這是我的代碼:

    enc = MultiLabelBinarizer()
    print("Encoding data...")
    # Fit the encoder onto all possible data values
    print(pandas.DataFrame(enc.fit_transform(df["present"] + df["member"].apply(str).apply(lambda x: [x])),
                           columns=enc.classes_, index=df.index))
    X, y = enc.transform(df["present"]), list(df["member"].apply(str))
    print("Training svm...")
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0)
    y_train = enc.transform([[x] for x in y_train])  # Strings to 1HotVectors
    svc = svm.SVC(C=1.1, kernel="linear", probability=True, class_weight='balanced')
    svc.fit(X_train, y_train)  # y_train should be 1D but isn't

我得到的異常是:

Traceback (most recent call last):
  File "C:/Users/SawyerPC/PycharmProjects/DiscordSocialGraph/encode_and_train.py", line 129, in <module>
    enc, clf, split_data = encode_and_train(df)
  File "C:/Users/SawyerPC/PycharmProjects/DiscordSocialGraph/encode_and_train.py", line 57, in encode_and_train
    svc.fit(X_train, y_train)  # TODO y_train needs to be flattened to (n_samples,)
  File "C:\Users\SawyerPC\Anaconda3\lib\site-packages\sklearn\svm\base.py", line 149, in fit
    X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr')
  File "C:\Users\SawyerPC\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 547, in check_X_y
    y = column_or_1d(y, warn=True)
  File "C:\Users\SawyerPC\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 583, in column_or_1d
    raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (5000, 10)

我最終使用LabelEncoder解決了這個問題。 謝謝@ G.Anderson。 flat_member_list只是在標簽y和向量X遇到的所有唯一用戶ID的列表。

# Encode "present" users as OneHotVectors
mlb = MultiLabelBinarizer()
print("Encoding data...")
mlb.fit(df["present"] + df["member"].apply(str).apply(lambda x: [x]))

# Encode user labels as ints
enc = LabelEncoder()
flat_member_list = df["member"].apply(str).append(pandas.Series(np.concatenate(df["present"]).ravel()))
enc.fit(flat_member_list)
X, y = mlb.transform(df["present"]), enc.transform(df["member"].apply(str))
print("Training svm...")
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0, stratify=y)
svc = svm.SVC(C=0.317, kernel="linear", probability=True)
svc.fit(X_train, y_train)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM