bugfix> python > 投稿

これが私のコードです:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
#Shape(1259,11)
#Columns(Area, BHK, Bathroom, Furnishing, Locality, Parking, Price, Status, Transaction, Type, Per_Sqft)
data_file = pd.read_csv("Delhi_House_Pricings.csv")
model = LinearRegression()
Y = np.array(data_file["Price"]).reshape(-1,1)
X = np.array(data_file["Area"]).reshape(-1,1)
X_train, X_test, Y_train,  Y_test = train_test_split(X, Y, test_size = 0.3, random_state = 1)
model.fit(X_train, Y_train)
Y_test_predicted = model.predict(X_test)
plt.style.use("ggplot")
plt.scatter(X_test, Y_test, label = "Test_Data", alpha = 1)
plt.plot(X_test, Y_test_predicted, label = "Prediction")
plt.legend(loc = "upper left")
plt.xlabel("Area")
plt.ylabel("Price")
print(model.score(X_test,Y_test_predicted))
plt.show()

アルファ1の場合:

アルファ= 0.2

グラフの最もクラスター化された部分でAlpha = 0.2およびZoomed:

明らかに、ラインはその大部分を通過していません...

どうすれば傾斜を改善できますか? 線形回帰の代わりに優れた他のより良い方法はありますか?

回答 3 件
  • あなたの質問についてのいくつかのポイント:

    結果の品質

    あなたの場合、線形回帰の結果は、モデリングの仕様に誤りがあるため、使用できないほど「間違っている」わけではありません。回帰直線はそうではなく、過剰適合はあなたが知っていると確信しているように過適合と同じくらい悪いので、データにあるすべての点を通過することは決してありません。

    あなたの応答変数以来 Price おそらく元のデータセット内のすべてのデータの関数であり、したがって単なる Area 、フィット線があまり良くないことを期待する必要があります。 Area 価格の変動の一部のみをキャプチャするため、予測子の値と応答の間のエラーの計算は、おそらく大きくなります。これを評価するための最良の最初のステップは、からの予測値をプロットすることです。トレーニングセット残差に対して。これは、その理由と方法に関するすばらしい投稿です。結果として、モデルにさらに多くの、場合によっては変換された(@raffaemのポイントごとの)機能を含めると、フィットが改善される可能性があります。 (実際には、より多くの変数を含めると、常に改善されます R^2 、しかしそれは別の問題です。)

    適合性の評価

    あなたは正しいです model.score() 1(または100%)を返す R^2 )は、基礎となる仕様で何かが正しくないことを示すシグナルです。予測されたデータが観測されたデータと正確に等しくない限り、これは実際には起こらないはずです。見る場所はデータ自体です。テスト/トレイン分割の実行方法に問題があるか、データ自体に問題がある可能性があります。アーティファクト自体を見ないと、本当にわかりません。

    そうは言っても、 score 方法は、モデルのパフォーマンスを理解するための1つの方法にすぎず、多くの場合、最善の方法ではありません。スコアに関連するのは、平均二乗誤差、平均絶対誤差、およびその他のより洗練された方法です。モデルのパフォーマンスを評価するときは、これらのメトリックを確認する価値があるかもしれません。繰り返しになりますが、ここにコード例を含む短い記事があります。

    その他の方法

    線形回帰は単純ですが、そのため強力です。私の提案は、常に単純なモデルから始めて、一度に少しだけ複雑さを追加し(新機能、新しい変換)、それが結果に何を意味するのかを完全に理解することです。もちろん、使用するはるかに洗練された方法がたくさんありますが、これらは欺くことができます。開始するのに最適な場所は、機能と応答変数の関係を検討することです。時間依存性、空間依存性、打ち切り、相互作用などの要因がある場合、その後機能を応答にリンクする関数でこれらの関係をキャプチャするための、より複雑な方法を検討してください。

  • 勾配を平らな線に向かって引っ張る2つの外れ値(グラフの右下の点)があります。 「より良い回帰直線」とはどういう意味かわかりません。回帰直線は、直線と点の間の平均二乗誤差を最小化する直線です。

    編集:テストデータをプロットしていることがわかりました。 なぜテストデータをプロットしているのかわかりません。回帰直線は、トレーニングセットの二乗誤差を最小化します

  • ここでの良い解決策は、データを変換することかもしれません。RobustScalerは外れ値をかなりうまく処理します。

    これは、厄介な外れ値を持つデータのいくつかの変換方法に関するkaggleに関する記事です。

    https://www.kaggle.com/mikalaichaly/compare-different-scalers-on-data-with-outliers#StandardScaler

あなたの答え