-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
データ分析: 欠損値補完について2 #5
Comments
ありがとうございます. |
@tottocoslowlifer 確認しました. 非常に良くできていると思いました.
2つ目については関数を作成するのが良いかなと思います. 3つ目は少し問題があります. 理由としては, 潮位のデータの1日が0〜23時なのに対し, 下関の気象データは1〜24時になっているからです. 以上のご対応をよろしくお願い致します. |
対応が完了いたしました. |
お疲れ様です. ご対応いただきありがとうございます. まず, 前提として関数はセクション冒頭にまとめましょう. この際, 関数間は2行空けます. また, 返り値は基本的には用意しましょう. やっていただくこと順を追ってやってみましょう.
それぞれでの注意事項を説明します. 3つの
|
すみません, 補足です.
こちらについて, 最終日(2021-12-31)は欠損値ではなく前日と同じ差分を足して埋めてみましょう. |
お疲れ様です.先ほど,notebookをコミットいたしました. 最後の
に取り組んでいるところなのですが, 30個目のセルのように, よろしくお願いいたします. |
@tottocoslowlifer 全体的によく書けています. 関数の中身も的確です◎ 以下コメントになります. コメントまずはコードを確認してのコメントになります. 1個目のセル
現在, 24個目のセル
dt_ymd = dt.date(dt_ymd.year, dt_ymd.month, dt_ymd.day) + dt.timedelta(days=1) とするのが良いと思います.
一方で,
という感じだと思います. 26個目のセルここは確認として 29個目以降のセルこれらは今調整中と見ています. 出来次第関数は24個目のセルの中に入れていきましょう. 質問に対するコメント
こちらに対する回答ですが, Timestamp 型になることが理想でした(なので間違ってはいないです).
という役割を担っています. 現在, |
@tottocoslowlifer コメントいくつかポイントがあります.
まず, meta_append = []
for i in range(len(shimonoseki_df)):
ymd = shimonoseki_df.loc[i,"年月日時"]
if dt.datetime.date(ymd) in list(df["年月日"]):
meta_append.append([ymd]) この中にもいくつか注意事項があります.
という感じです. 続いて, 一旦 ここまでを受けて, 一つの関数
|
ありがとうございます. |
確認できました. ご対応ありがとうございます. それでは, preprocessed_df = pd.merge(flattened_df_same, shimonoseki_df, on="年月日時", how="inner")
preprocessed_df これを実行し, エラーが出ないかを確認しましょう. これができたら重回帰分析にかけてみましょう. X: ["黄経差", "月齢", "こよみ", "気象庁", "MIRC", "降水量(mm)", "気温(℃)"] この際, |
@tottocoslowlifer for i in range(len(df)):
time = df.loc[i, "年月日時"]
dt_ymd = dt.datetime.strptime(time.split("日")[0]+"日", "%Y年%m月%d日")
dt_time = time.split("日")[1]
if dt_time == "24時":
dt_ymd = dt.date(dt_ymd.year, dt_ymd.month, dt_ymd.day) + dt.timedelta(days=1)
dt_time = "0時"
dt_time = dt.datetime.strptime(dt_time, "%H時")
dt_ymd = dt.date(dt_ymd.year, dt_ymd.month, dt_ymd.day)
dt_time = dt.time(dt_time.hour)
df.loc[i, "年月日時"] = dt.datetime.combine(dt_ymd, dt_time) の最後の行で, 直接値を書き換えていたのが良くなかったみたいです. 例えば, for 文の前に times = [] というのを用意し, 上記最後の行を times.append(dt.datetime.combine(dt_ymd, dt_time)) のようにして一旦リストとして持っておいて, 後で DataFrame にするというのが良いかなと思います. なるべく def call_shimonoseki() -> pd.DataFrame:
df = pd.read_csv("../data/Shimonoseki_2011-2021/Shimonoseki.csv").rename(columns={"Unnamed: 0": "年月日時"})
times = []
for i in range(len(df)):
time = df.loc[i, "年月日時"]
dt_ymd = dt.datetime.strptime(time.split("日")[0]+"日", "%Y年%m月%d日")
dt_time = time.split("日")[1]
if dt_time == "24時":
dt_ymd = dt.date(dt_ymd.year, dt_ymd.month, dt_ymd.day) + dt.timedelta(days=1)
dt_time = "0時"
dt_time = dt.datetime.strptime(dt_time, "%H時")
dt_ymd = dt.date(dt_ymd.year, dt_ymd.month, dt_ymd.day)
dt_time = dt.time(dt_time.hour)
times.append(dt.datetime.combine(dt_ymd, dt_time))
rain = []
temp = []
item_dict = {"降水量(mm)": rain, "気温(℃)": temp}
for i in range(len(df)):
for item in ["降水量(mm)", "気温(℃)"]:
if df.loc[i, item] == "--":
item_dict[item].append(float(0))
elif df.loc[i, item] == "///":
item_dict[item].append(float("nan"))
else:
df.loc[i, item] = "".join(re.findall(r"\d+\.\d+", str(df.loc[i, item])))
if df.loc[i, item] == "":
df.loc[i, item] =- float("nan")
item_dict[item].append(float(df.loc[i, item]))
return pd.DataFrame({"年月日時": times, "降水量(mm)": rain, "気温(℃)": temp}) 書き方に質問があればお答えします. もし納得いただけたら, 同様にして これでしっかりとデータの結合が出来るはずです. よろしくお願いいたします. |
できました!!! |
お疲れ様です.
引き続き, こちらの重回帰分析にかけるところまでをよろしくお願い致します. |
ありがとうございます. コメント24個目のセル非常に細かいことで申し訳ありません. 各所の黄経差を表す単語, "longtitude" 25個目のセルここは消してしまいましょう. 27, 28個目のセルこのままで大丈夫なのですが, preprocessed_df_diff = pd.merge(flattened_df_diff, shimonoseki_df, on="date", how="inner").drop("date", axis=1) のようにして削除してしまいましょう. 重回帰分析のセクションについてこちらは「欠損値補完」の「メタ情報を用いた補完」の中に入っている項目なので, 「#」は4つにしましょう. 29個目のセル欠損値の確認は大事ですね◎ 30個目のセルヒストグラムを出していただいていますが, 意図があまりわかりませんでした. ここから相関係数の算出や, PCA(主成分分析)などをして特徴量の重要度を割り出すなどをしないのであれば不要な気もします. 31個目のセルいただいた質問ですが, なぜ2015〜2016年の欠損値が無いデータで学習する際にエラーが起きるかというと, この期間の中に
こちらですが, 基本的にデータは使えるだけ使いましょう. なぜなら, 今の欠損値補完は時系列データとしてでなく, テーブルデータとして見ているからです. 時間依存が無いので, より多くのデータを用いることができます. 手順としては,
|
ありがとうございます. |
@tottocoslowlifer
これを直して次の作業をしていただきます. 作業内容作ったモデル また, ここまでを関数化してみましょう. 予測値についてはそれぞれ四捨五入で整数値に変換してから誤差を計算しましょう. |
ありがとうございます. |
@tottocoslowlifer
これが終わったら, 今までのことについて質問があればお答えします. |
完了いたしました. |
@tottocoslowlifer
次のように変えれば大丈夫です. def train_predict(X, y, split_rate):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=split_rate, random_state=316)
regressor = LinearRegression().fit(X_train, y_train)
y_pred = regressor.predict(X_test)
for i in range(len(y_pred)):
y_pred[i] = round(y_pred[i])
mae = np.mean(abs(y_pred - y_test))
mse = np.mean((y_pred - y_test) ** 2)
print("MAE train: ", mae)
print("MSE train: ", mse)
return regressor |
ありがとうございます.コミットいたしました. 「説明変数の数字のスケールが異なる場合は標準化を行う」という認識でいたのですが,今回の場合なら必要ないのでしょうか. よろしくお願いいたします. |
ご対応ありがとうございました.
非常に良い質問だと思います. こちらについては, 「重回帰分析『だから』標準化が要らない」と回答させていただきます. 他の手法, 例えばニューラルネットワークなどであれば, そのスケールの違いから学習が困難になる場合が多いのですが, 重回帰分析では, と表され, 偏回帰係数 となります. ここで, と表せ, となり, 式全体への寄与としては, |
なるほど,重回帰分析の場合は,標準化の操作がスケールへ何ら影響しないということであっていますでしょうか. ご回答ありがとうございました. |
標準化をすることはデータの前処理としての過程であり, 特徴量のスケールを変更しているので, この考え方は少し違うように感じます. 「標準化をする」 = 「特徴量のスケールを揃える」です. 一方で, 重回帰分析による予測の際は, このスケールの「違い」についての影響を受けないということです. |
ありがとうございます. |
そうですね, それは正しいと思います. |
分かりました.ありがとうございます. 他の事柄に関しては,現時点では質問がないです. |
ありがとうございます. それでは次の話に参りたいと思いますが, 今回の重回帰分析の結果を見て「思ったほど良くない」と感じていただけると嬉しいです. では, 本当にこの方法でモデルを作ったことが良くなかったのかを考察してみましょう. 振り返りまず, 「メタ情報を用いた補完」では, 3種類の DataFrame の情報を用いてそれらを結合し, 不適切なデータを取り除いて, 次のように説明変数と目的変数を設定しました.
この 過去の情報を使ってみる説明変数の中に, 過去(例えば直近10時間)の潮位のデータを特徴量として加えてみるということを考えます. 具体的には,
作業内容
追加で1点先ほどの, print("MAE: ", mae)
print("MSE: ", mse) |
対応が完了いたしました. |
@tottocoslowlifer コメント精度も非常に高くなっていて, 処理としては概ね正しいです. 一方で最後のところで, 今まで使っていた降水量等のデータがなくなっているので, コード面でいくつか直していただきたいです. ご対応をよろしくお願い致します. 24個目のセル
32個目のセル次のようにしましょう. preprocessed_df_same_shift, new_cols = tide_shift(preprocessed_df_same, 10)
cols = ["longitude", "moon phase", "calendar", "JMA", "MIRC", "rainfall(mm)", "temperature(℃)"] + new_cols
X = preprocessed_df_same_shift[cols]
y = preprocessed_df_same_shift["tide level"]
regressor = train_predict(X, y, 0.50) |
夜分に申し訳ありません. |
@tottocoslowlifer ご対応ありがとうございました. |
お疲れ様です. |
こちらは,
でいうとどちらでしょうか? |
1です. |
ありがとうございます. まず, 機械学習というものは, 次のような分析方法です(出典: 機械学習 | 用語解説 | 野村総合研究所(NRI)).
機械学習や深層学習などの本質は, 学習させること自体ではなく, そこから機械が導いたロジックに基づいて「予測・判断」をすることにあります. 今回の場合, なぜ重回帰分析をしたのかを考えていただきたいです. 重回帰分析は, 教師あり学習の「回帰」問題で扱われる代表的なモデル構造であり, 説明変数から目的変数を予測する機械学習アルゴリズムです. 今までの「メタ情報を用いた補完」では, いくつかの説明変数を用意し, それに対する線形写像である(ことが望ましい)目的変数を予測するということを重回帰分析を用いて行いました. 説明変数: X(ある日のある時刻における) = [
"黄経差", "月齢", "こよみ", "気象庁",
"MIRC", "降水量", "気温",
"1時間前の潮位", "2時間前の潮位", "3時間前の潮位",
"4時間前の潮位", "5時間前の潮位", "6時間前の潮位",
"7時間前の潮位", "8時間前の潮位", "9時間前の潮位", "10時間前の潮位",
] 目的変数: y(ある日のある時刻における) = ["潮位"] さて, これである日のある時刻の説明変数が揃っている場合, これらの情報を基にその時刻の潮位を機械が教えてくれるようになりました. これが現在の状況です. 今の notebook の一番最後のセルの一番最後の コーディングに移る前に, 今一度やってきたことでわからないことが無いかを確認いただき, 上記の説明に納得していただきたく存じます. |
ありがとうございます.
とあるのですが,欠損値を含むデータに 例えば それとも,処理の上で pre_df = pre_df.dropna(subset=["rainfall(mm)", "temperature(℃)"])
pre_df = pre_df.dropna(subset=X) としてこれらのケースを除くのでしょうか. よろしくお願いいたします. |
ありがとうございます. 良いご質問です. 結論から言うと, それはご自身で確認いただきたいところです. 潮位のデータとその他のデータが同時に欠損している場合が無いかを調べ, 無ければそのまま |
お疲れ様です. そのため,これらの箇所周辺で 重回帰分析モデルの説明変数を再度,見直すべきでしょうか. |
潮位のデータのみが連続して欠損している場合は, 一つずつ補ってずらすというように再帰的にモデルに入れてみると良いと思います. モデルの説明変数を見直す必要はありません. |
承知致しました. それではまたカレンダー内の「空」の部分に予定を入れておいてください. Zoom の情報は以下の通りになります. https://tus-ac-jp.zoom.us/j/92156768099?pwd=VU1MOFdiNFVkdzhBZlNTVXRRWnVpUT09 ミーティング ID: 921 5676 8099 よろしくお願い致します. |
欠損値の補完が完了したため close とします. お疲れ様でした. |
こちらより
欠損値補完の処理として, メタ情報を考慮した補完を行いたい.
2011年1月1日〜2021年12月31日までの11年間のデータを用いて, 以下のメタ情報を付加した重回帰分析によって補完する方法を考えてみる.
重回帰分析
重回帰分析は, 説明変数$x_i (i = 1, ..., n)$ と目的変数 $y$ について, 偏回帰係数 $a_i (i = 0, 1, ..., n)$ をモデルの学習によって決定し,
という回帰式を作ることを目的とする分析である.
復習資料:
今回は, 目的変数を時刻$t$ の潮位に, 説明変数を時刻 $t$ の,
中潮
3
など )--
は0
に変換するの計7個とする.
対応していただくこと
まずは2種類のファイル
tide/data/Moon_2011-2021/Mooncal_2011-2021.csv
tide/data/Shimonoseki_2011-2021/Shimonoseki.csv
を呼び出し,
tide/data/Moji_Tide_2011-2021/csv/9010_2011-2021.csv
と上手く時刻毎に結合されたDataFrame
を作成してみましょう.The text was updated successfully, but these errors were encountered: