我目前正在尝试使用 scikit-learn 中的 GridSearchCV 调整超参数,使用“Precision at k”评分指标,如果我将分类器分数的前第 k 个百分位数分类为正类,这将给我精度。我知道可以使用 make_scorer 创建一个自定义记分器并创建一个 score 函数。这就是我现在所拥有的:
from sklearn import metrics
from sklearn.grid_search import GridSearchCV
from sklearn.linear_model import LogisticRegression
def precision_at_k(y_true, y_score, k):
df = pd.DataFrame({'true': y_true, 'score': y_score}).sort('score')
threshold = df.iloc[int(k*len(df)),1]
y_pred = pd.Series([1 if i >= threshold else 0 for i in df['score']])
return metrics.precision_score(y_true, y_pred)
custom_scorer = metrics.make_scorer(precision_at_k, needs_proba=True, k=0.1)
X = np.random.randn(100, 10)
Y = np.random.binomial(1, 0.3, 100)
train_index = range(0, 70)
test_index = range(70, 100)
train_x = X[train_index]
train_Y = Y[train_index]
test_x = X[test_index]
test_Y = Y[test_index]
clf = LogisticRegression()
params = {'C': [0.01, 0.1, 1, 10]}
clf_gs = GridSearchCV(clf, params, scoring=custom_scorer)
clf_gs.fit(train_x, train_Y)
然而,试图打电话fit
给我Exception: Data must be 1-dimensional
,我不知道为什么。任何人都可以帮忙吗?提前致谢。