【发布时间】:2017-10-23 18:10:02
【问题描述】:
我是机器学习和 python 的新手。现在我正在尝试应用随机森林来预测目标的二进制结果。在我的数据中,我有 24 个预测变量(1000 个观察值),其中一个是分类的(性别),其他的都是数字的。在数字值中,有两种类型的值,即欧元的货币量(非常倾斜和缩放)和数字(来自 atm 的交易数量)。我已经改变了大规模特征并进行了插补。最后,我检查了相关性和共线性,并在此基础上删除了一些特征(因此我有 24 个特征。)现在,当我实现 RF 时,它在训练集中总是完美的,而根据交叉验证,比率不是那么好。即使在测试集中应用它,它也会给出非常低的召回值。我该如何解决这个问题?
def classification_model(model, data, predictors, outcome):
# Fit the model:
model.fit(data[predictors], data[outcome])
# Make predictions on training set:
predictions = model.predict(data[predictors])
# Print accuracy
accuracy = metrics.accuracy_score(predictions, data[outcome])
print("Accuracy : %s" % "{0:.3%}".format(accuracy))
# Perform k-fold cross-validation with 5 folds
kf = KFold(data.shape[0], n_folds=5)
error = []
for train, test in kf:
# Filter training data
train_predictors = (data[predictors].iloc[train, :])
# The target we're using to train the algorithm.
train_target = data[outcome].iloc[train]
# Training the algorithm using the predictors and target.
model.fit(train_predictors, train_target)
# Record error from each cross-validation run
error.append(model.score(data[predictors].iloc[test, :], data[outcome].iloc[test]))
print("Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error)))
# Fit the model again so that it can be refered outside the function:
model.fit(data[predictors], data[outcome])
outcome_var = 'Sold'
model = RandomForestClassifier(n_estimators=20)
predictor_var = train.drop('Sold', axis=1).columns.values
classification_model(model,train,predictor_var,outcome_var)
#Create a series with feature importances:
featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False)
print(featimp)
outcome_var = 'Sold'
model = RandomForestClassifier(n_estimators=20, max_depth=20, oob_score = True)
predictor_var = ['fet1','fet2','fet3','fet4']
classification_model(model,train,predictor_var,outcome_var)
【问题讨论】:
标签: python-3.x scikit-learn random-forest