2015-08-22 27 views
1

我正在从Kaggle为泰坦尼克号案件执行学习任务。Python + SciKit - >手动和cross_val_score预测的不同结果

如果我手动分离数据或使用cross_val_score执行线性回归,我有不同的预测精度。逻辑回归也是如此。

示例。

- 线性回归。

手册

Algorithm = LinearRegression() 
kf = KFold(dataset.shape[0], n_folds=3, random_state=1) 
predictions = [] 

for train, test in kf: 

    train_predictors = (dataset[Predictors].iloc[train]) 
    train_target = dataset['Survived'].iloc[train] 
    Algorithm.fit(train_predictors, train_target) 
    test_predictions = Algorithm.predict(dataset[Predictors].iloc[test]) 
    predictions.append(test_predictions) 

predictions = np.concatenate(predictions, axis=0) 
print(predictions.shape[0]) 
realed = list(dataset.Survived) 
predictions[predictions > 0.5] = 1 
predictions[predictions <= 0.5] = 0 

accuracy2 = sum(predictions[predictions == dataset["Survived"]])/len(predictions) 
print("Tochnost prognoza: ", accuracy2 * 100, " %") 

结果 - 78,34%

Cross_val_score

scores=cross_val_score(LinearRegression(), dataset[Predictors], dataset["Survived"], cv=3) 
print(scores.mean()) 

结果 - 37.5%

- 逻辑回归。

这里我有26,15%的手动和78.78%的cross_val_score函数。

为什么?

回答

3

有几件事情对你的代码看起来相当不对。

  1. 你准确的计算是错误
    这条线:

    accuracy2 = sum(predictions[predictions == dataset["Survived"]])/len(predictions) 
    

    不计算精度。它所做的就是在你有正确的预测时所做的预测。这没有多大意义;)。
    这很容易,虽然修复:

    accuracy2 = sum(predictions == dataset["Survived"]/len(predictions) 
    
  2. 线性回归实际执行回归
    使用线性回归来执行分类任务并不是一个好主意。在(二进制)分类中,您期望输出范围为[0; 1](概率),而线性回归通常给你一个无限的范围。由于统计学家是线性回归的忠实拥趸,他们发明了逻辑回归,这实际上是对变换后的目标值的线性回归。
    底线:使用逻辑回归(非线性回归)进行分类。

  3. 得分方法不是那些你认为的
    cross_val_score需要scoring参数。这里你没有指定它(所以它是None),这意味着它将查找估算器的默认分数方法。LinearRegression的默认分数方法不是准确性。它是R^2系数。这与回归有关,而不是你想要做的事情。

    所以,当你这样做:

    scores=cross_val_score(LinearRegression(), dataset[Predictors], dataset["Survived"], cv=3) 
    print(scores.mean()) 
    

    什么你得到的是3倍交叉验证的平均R^2系数。
    当你用LogisticRegression做到这一点时,你会得到平均准确度,这正是你想要的。

点1和2说明你LogisticRegression得到的结果与cross_val_scoreLinearRegression
我不确定第一个案例,如果我找到了一个好的解释,我会更新我的帖子。我发现它令人惊讶,因为你在计算精度上犯的错误应该总是低估的结果。除非这当然不是你运行的实际代码。

+1

+1。我想知道,为什么一个花时间写出这样详细,明确而有用的答案的人没有费心为他/她自己提出超出“用户......”的独特名称。 – lanenok

相关问题