我是机器学习的新手,我有一个自定义的数据集,包含法院案件。数据集的列包括指控(字符串)、先前案件(整数)和保释金额(整数)。我使用指控和先前案件作为特征,而保释金额作为我的标签。我希望能够根据指控和先前案件预测保释金额。我使用MLPClassifier作为我的模型,并尝试了几种其他模型。我的准确率只有大约45%。如何提高它?我是否只需要尝试不同的模型,如KNN?我转换数据的方式是否有问题?反复试错让我来到了这里。
import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.neural_network import MLPClassifierfrom sklearn.preprocessing import LabelEncoderfrom sklearn.metrics import accuracy_score# 导入CSVfinal_df = pd.read_csv('merge.csv')# 删除保释金额超过10,000美元的行outlier = final_df[final_df.bond >= 10000].indexfinal_df.drop(outlier, inplace=True)# 从CSV中获取特征X = final_df[['prior_cases', 'charges']].values# 从CSV中获取标签y = final_df[['bond']].valuesle = LabelEncoder()# 转换X数据for i in range(len(X[0])): X[:, i] = le.fit_transform(X[:, i])# 转换y数据for i in range(len(y[0])): y[:, i] = le.fit_transform(y[:, i])# 分割数据,80%用于训练X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, train_size=0.8)# 定义模型以训练数据model = MLPClassifier(activation='relu', solver='adam', hidden_layer_sizes=(100,), random_state=1, max_iter=500)# 训练模型model.fit(X_train, y_train)# 给出预测标签predictions = model.predict(X_test)# 模型的准确率acc = accuracy_score(predictions, y_test)print('实际值:----', le.inverse_transform(y_test[100]))print('预测值:', le.inverse_transform(predictions[100].reshape(-1,1)))print('准确率: ', acc)
回答:
导致低准确率的原因有很多。我在下面列出了一些常见的原因。
数据
- 您使用的数据可能不适合您选择的模型。
- 您的数据可能不够干净,无法使模型达到高准确率。
- 您可能需要使用一些特征工程技术来探索数据的不同方面。这些技术也被称为试错法,您可以创建不同的特征并使用模型来评估它们。
模型
- 您的模型可能不适合您使用的数据类型。例如,有些模型更喜欢离散值而不是连续值,反之亦然。
- 您选择的超参数可能不是最佳的。这需要调参过程,您需要尝试一组不同的参数在您的模型中。
评估
- 假设您的数据很好,您的模型也适合您的数据,但您使用的评估指标可能不是评估模型的正确指标。
- 如果您的模型是为分类问题构建的,您可能需要再次检查用于测试的数据是否干净。