我正在尝试根据训练数据使用逻辑回归对测试数据中的一系列点进行分类。
我得到了一个没有错误的输出,但我被告知结果是错误的(不正确的输出将被视为错误,但运行代码时没有错误)。
训练数据是 375 个点中 4 个不同类别的集合,每个点有 3 个变量,因此绘制在 3D 图上。我在集合上运行了一个计数程序,发现超过 50% 的点属于分类 2。我最初的结果是所有测试点都属于类别 2。我尝试将训练数据分类为几个不同的集合:随机选择125 个条目(这是测试数据的大小),找到所有类别的最小数量,并使用每个类别中相同数量的点创建训练集。
无排序 = 所有类别 2
随机排序 = 所有 2 类
等类编号排序 = 给我一个答案,该答案的分数分为所有 4 个类别,但当我将它们插入在线最终测试表时,我的准确度分数为 26%,这与随机机会相同。所以,我没有正确处理数据,而且我不确定在哪里。我希望在回归分类方面有更多经验的人可以为我指明正确的方向。
在调用 LogisticRegression 之前,是否需要重新格式化(转换)train_X、train_y 和 test_X 数组?如果是这样,怎么办?也许我只是给它提供了格式错误的数据?
# forming tables to push through logistic regression
train_X = []
train_y = []
for i in range(len(train_table)):
train_X.append(
[train_table.x.iloc[i], train_table.y.iloc[i], train_table.z.iloc[i]]
)
train_y.append(train_table.label.iloc[i])
test_X = []
for k in range(len(test_table)):
test_X.append([test_table.x.iloc[k], test_table.y.iloc[k], test_table.z.iloc[k]])
# Trying with and without normalize
clf = LogisticRegression().fit(normalize(train_X), train_y)
# clf = LogisticRegression().fit(train_X, train_y)
predict = clf.predict(test_X[:])
prob = clf.predict_proba(test_X[:])
results = pd.DataFrame(
sort_results(test_table, predict, prob),
columns=["", "timestamp", "UTC time", "label", "accuracy"],
)
因此,我编写了一个过程来比较 LogisticRegression 和 RandomForestClassifier,并通过它推送我的数据。使用 RandomForestClassifier 的准确性要好得多。
事实证明,LogisticRegression 返回全部 2 并不是一个错误,它只是精度较低的结果。我使用 RandomForestClassifier 重写了程序,并添加了 RandomizedSearchCV,它创建多个树,选择精度最高的树,并用它来预测分类。
新的返回值仍然大部分是2,但精度大大提高了。
param_dist = {'n_estimators': randint(100, 375),
'max_depth': randint(5, 20)}
rf = RandomForestClassifier()
rand_search = RandomizedSearchCV(rf, param_distributions = param_dist, n_iter=10, cv=5)
rand_search.fit(X, y)
best_rf = rand_search.best_estimator_
print('Best hyperparameters:', rand_search.best_params_)
predictions = pd.Series(best_rf.predict(to_pred_covariates))