【问题标题】:Building a classification model建立分类模型
【发布时间】:2019-04-15 22:33:21
【问题描述】:

我有一些 1500 行和 30 列的学生数据。我用过GradientBoostingClassifier。所有的数据都是分类的,在 0-80 和 0-90 的范围内。

我需要建立一个预测模型来预测学生是否会失败和通过。列“状态”是我的目标变量。下面是我用过的代码

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
data=data.apply(le.fit_transform)

X=data.copy()
y=data['Status']
# Import train_test_split function
from sklearn.model_selection import train_test_split
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
#Import Gradient Boosting Classifier model
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier()
gb.fit(X_train, y_train)

#Predict the response for test dataset
y_pred = gb.predict(X_test)

以下是我的模型表现。

Accuracy: 0.9719317419707395
Precision: 0.9090272918124562
Recall: 0.5650282731622445

请告诉我应该如何改进模型以及如何处理广泛的分类数据。此外,当我在不同的数据集上测试模型时,大多数时候类别会由于拼写错误或新增内容而发生变化

std_id  std_name Dem secn_id location bucket Primary_subject status
144     amy      SEP 5.3     P        dev    english         pass
230     mani     SEV 11.3    E        Tech   math            fail
299     sam      DE  5.1     nap      prac   science         pass
568     samy     SEP 1.1     P        prac   V1              pass
769     elle     SEP 1.2     pe       prac   english         pass
761     tanj     SEP 1.3     N        tech   V2              pass
112     jon      ERM 3.0     N        prac   phy             fail
116     pal      NAN 9.1     sc       etc    V1V2            pass
116     pal      NAN 9.2     sc       etc    V1V3            fail
113     josh     NAN 9.3     du       etc.   erp             fail
100     sug      EVV 9.1     sc       NAN    che             pass
323     adi      ERP 3.1     NAN      fit    math            fail
323     adi      ERP 3.2     NAN      fit    math            fail

这就是我的输入数据的样子。对于缺失值,我已将其替换为字符串“NAN”。如果学生更改了任何选项,则存在重复记录。

【问题讨论】:

  • 准确度 0.97 需要提高吗?
  • 你能添加两个类的 Prec,Recall
  • 虽然准确度是 0.97。当我使用一组新数据,对其进行转换并适应这个模型时,它会给出非常错误的预测

标签: python machine-learning scikit-learn


【解决方案1】:

您的模型表现不错。 进一步改进

  1. 调整GradientBoostingClassifier 的参数。您可以为n_estimatorslearning_rate 等参数设置值并检查模型的性能。 对于这个任务,我建议GridSearchCV

  2. 特征工程:您可以从现有特征中创建新特征。由于您没有提供数据,因此很难提出任何建议。可以通过Random Forest等查看特征重要性,使用重要性高的特征。

  3. 您可以尝试不同的算法,例如XGBoostLightGBM 甚至neural network

  4. 你可以使用像Stratified ShuffleSplit这样的交叉验证器

关于你的下一个问题。

再一次,如果不查看任何数据,就很难提出任何建议。 为避免拼写错误,您可以强制用户从下拉列表等中选择值。 如果不是这种情况,您可以查看difflib 库,它会找到与您的类别最接近的匹配项。

【讨论】:

  • 我正在尝试在不同的数据集上测试此模型。但是在对类别值进行标签编码时。我看到了差异。就像在对数据进行编码之后,列“位置”P 值被转换为 1。但是当我对 data_new 进行标签编码时,列“位置”P 被转换为 3。请让我知道这会影响模型的性能以及如何解决这个问题。
  • 您可以预定义类别并使用它们。因此 P 的值将始终为 1。请参阅 answer 的第二部分
  • 我试过上面提到的链接。对其进行了一些修改,并使用 names = (np.unique(df.values)) 在 dict 中创建了我自己的编码 ran = len(np.unique(df.values)) my_enc = dict(zip( names, range(ran+1 ))) df.replace(my_enc, inplace=True)。使用这个我已经修复了差异。但是我的唯一值的长度是 115。所以我有从 0 到 115 的数字。我想知道这是否会引起问题?因为模型可能会考虑层次结构,如 115>93>45 等。对此有何建议??
【解决方案2】:

首先我建议从一些数据清理和数据分析开始。 您的类别因错误而发生变化的事实需要在预处理步骤中进行修复。这里没有太多捷径,需要手动检查修复数据。

还要检查是否存在缺失值。如果存在缺失值,您还需要解决此问题。您可以删除样本(接受信息丢失)或用特定特征的平均值替换缺失值。文献中还有其他方法,但作为第一步,这两种方法可以做到。

请考虑检查每个班级的样本数量。如果这两个类严重不平衡,您可以考虑寻找解决“不平衡数据”的解决方案。

分类器作为决策树/随机森林是处理分类变量时的不错选择。

使用交叉验证来调整分类器的超参数也可以提高性能。

EDIT(添加数据表后)

您可能不想使用学生的姓名,因为该功能与考试的成败无关。

【讨论】:

  • 太棒了。您已经涵盖了我在回答中遗漏的主题:-)
猜你喜欢
  • 2021-04-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多