1

タイタニックの場合、Kaggle から学習タスクを実行しています。

データを手動で分離するか、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%、cross_val_score 関数で 78,78% を使用しています。

どうして??

4

1 に答える 1

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 は accuracy ではありません。R^2係数です。これは、実際にやろうとしていることではなく、回帰に関連しています。

    したがって、これを行うと:

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

    あなたが得ているのは、3 分割交差検証の平均 R^2 係数です。
    これを行うと、LogisticRegression希望どおりの平均精度が得られます。

ポイント 1 と 2 は、 onLogisticRegressioncross_val_scoreon で得られる結果を説明していLinearRegressionます。
最初のケースについてはまだよくわかりません。適切な説明が見つかったら投稿を更新します。精度の計算で犯した間違いは常に結果を過小評価するはずなので、これは非常に驚くべきことです。もちろん、これが実際に実行したコードでない限り。

于 2015-08-23T11:31:12.767 に答える