将(n_samples,n_features)个ndarray转换为(n_samples,1)个向量数组,以用作sklearn SVM的训练标签

时间:2018-10-12 22:05:25

标签: python pandas numpy encoding scikit-learn

我正在尝试为我正在构建的SVM模型计算ROC和AUC。我正在遵循this sklearn example中的代码。要求之一是输出标签y需要二进制化。我通过使用创建MultiLabelBinarizer并编码所有标签来做到这一点,效果很好。但是,这将创建一个(n_samples,n_features)个ndarray。 classifier.fit(X, y)函数假定y.shape = (n_samples)。我想本质上将y的列“混在一起”,以便y [0] [0]将返回整个特征向量V,而不仅仅是返回{{1 }}。

这是我的代码:

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

1 个答案:

答案 0 :(得分:0)

我最终使用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)