我正在尝试为我正在构建的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
答案 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)