我正在尝试使用各种技术(例如SMR,Logistic回归等)创建ML模型(回归)。使用所有技术,我无法获得超过35%的效率。这是我在做什么:
X_data = [X_data_distance]
X_data = np.vstack(X_data).astype(np.float64)
X_data = X_data.T
y_data = X_data_orders
#print(X_data.shape)
#print(y_data.shape)
#(10000, 1)
#(10000,)
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.33, random_state=42)
svr_rbf = SVC(kernel= 'rbf', C= 1.0)
svr_rbf.fit(X_train, y_train)
plt.plot(X_data_distance, svr_rbf.predict(X_data), color= 'red', label= 'RBF model')
对于情节,我得到以下信息:
我尝试了各种参数调整,更改了参数C,伽玛甚至尝试了不同的内核,但没有任何改变。即使尝试过SVR,也可以使用Logistic回归代替SVC,但是没有任何帮助。我尝试了不同的缩放比例来训练
StandardScalar()
和scale()
等输入数据。我用this作为参考
我该怎么办?
最佳答案
根据经验,我们通常遵循以下约定:
对于少量功能,请使用Logistic Regression
。
对于许多功能但数据不多,请使用SVM
。
要获得许多功能和大量数据,请使用Neural Network
。
因为您的数据集是1万个案例,所以最好使用Logistic Regression
,因为SVM
可能要花很长时间才能完成!
不过,由于您的数据集包含许多类,因此在实现中可能会出现类不平衡的情况。因此,我尝试通过使用StratifiedKFold而不是train_test_split
来解决此问题,这不能保证拆分中的平衡类。
此外,我使用GridSearchCV和StratifiedKFold进行交叉验证,以便调整参数并尝试所有不同的优化器!
因此完整的实现如下:
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV, StratifiedKFold, StratifiedShuffleSplit
import numpy as np
def getDataset(path, x_attr, y_attr):
"""
Extract dataset from CSV file
:param path: location of csv file
:param x_attr: list of Features Names
:param y_attr: Y header name in CSV file
:return: tuple, (X, Y)
"""
df = pd.read_csv(path)
X = X = np.array(df[x_attr]).reshape(len(df), len(x_attr))
Y = np.array(df[y_attr])
return X, Y
def stratifiedSplit(X, Y):
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=0)
train_index, test_index = next(sss.split(X, Y))
X_train, X_test = X[train_index], X[test_index]
Y_train, Y_test = Y[train_index], Y[test_index]
return X_train, X_test, Y_train, Y_test
def run(X_data, Y_data):
X_train, X_test, Y_train, Y_test = stratifiedSplit(X_data, Y_data)
param_grid = {'C': [0.01, 0.1, 1, 10, 100, 1000], 'penalty': ['l1', 'l2'],
'solver':['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']}
model = LogisticRegression(random_state=0)
clf = GridSearchCV(model, param_grid, cv=StratifiedKFold(n_splits=10))
clf.fit(X_train, Y_train)
print(accuracy_score(Y_train, clf.best_estimator_.predict(X_train)))
print(accuracy_score(Y_test, clf.best_estimator_.predict(X_test)))
X_data, Y_data = getDataset("data - Sheet1.csv", ['distance'], 'orders')
run(X_data, Y_data)
尽管尝试了所有不同算法,但准确率均未超过36%!!
这是为什么?
如果您想让一个人通过其T恤衫颜色识别/分类,您不能说:嘿,如果它是红色,则表示他是约翰,如果它是红色,则是彼得,但是如果它是红色,则是过道!他会说“真的,hack是什么不同”?!
这就是您的数据集中的内容!
简单地,运行
print(len(np.unique(X_data)))
和print(len(np.unique(Y_data)))
,简而言之,您会发现数字太奇怪了:Number of Cases: 10000 !!
Number of Classes: 118 !!
Number of Unique Inputs (i.e. Features): 66 !!
所有课程都在共享大量信息,这使其达到36%的准确性令人印象深刻!
换句话说,您没有提供信息的功能,导致每个类模型的唯一性不足!
该怎么办?
我相信您不允许删除某些类,因此仅有的两种解决方案是:
要么接受这个非常有效的结果。
或添加更多信息功能。
更新资料
您提供了相同的数据集但具有更多功能(即完整的功能集)后,情况就不同了。
我建议您执行以下操作:
预处理数据集(即通过估算缺失值或删除包含缺失值的行并将日期转换为某些唯一值(example)...等进行准备)。
检查哪些功能对于
Orders
类最重要,可以通过使用Forests of Trees
评估功能的重要性来实现。 Here是如何在Scikit-Learn
中执行此操作的完整而简单的示例。创建数据集的新版本,但是这次将
Orders
保留为Y
响应,并将上面找到的特征保留为X
变量。遵循与我在上面的实现中向您展示的相同的
GrdiSearchCV
和StratifiedKFold
过程。暗示
如Vivek Kumar在下面的注释中所述,在
stratify
更新中已将Scikit-learn
参数添加到train_test_split函数。它通过传递类似数组的基本事实来工作,因此您在上面的函数
stratifiedSplit(X, Y)
中不需要我的解决方法。关于python-3.x - ML模型无法正确预测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53354060/