1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AIチャレンジ1(天気予報)

Last updated at Posted at 2023-09-09

 今回は、PythonとKerasを使ってAIを作成してみたいと思う。

 内容は以下の通り。
1,東京の天気(雨が降っているかどうか)を予測するAI

2,データのソースは以下のところから1年分をダウンロード
https://www.data.jma.go.jp/gmd/risk/obsdl/index.php

3,天気について、7つの説明変数を用いて二値分類モデルとKerasで学習

4,これらのソース・データを以下のフォルダにまとめております。
https://github.com/horiivalue/horiivalue.git

※細かいインポートは省略させていただく。

データ

dataset_tenki = pd.read_csv("data4.csv")
dataset_tenki.head()

# 列の抜き出し
dataset = dataset_tenki[['平均気温(℃)', '最高気温(℃)','最低気温(℃)', '平均風速(m/s)','最大風速(m/s)', '平均現地気圧(hPa)', '平均雲量(10分比)', '天気概況(昼:06時~18時)']]

# 列名をリネームする
dataset = dataset.rename(columns={'平均気温(℃)': 'kion1', '最高気温(℃)': 'kion2','最低気温(℃)': 'kion3','平均風速(m/s)': 'wind1','最大風速(m/s)': 'wind2', \
    '平均現地気圧(hPa)': 'kiatsu', '平均雲量(10分比)': 'cloud', '天気概況(昼:06時~18時)': 'tenki1'})

dataset.head()

image.png

データ加工

# 文字列に「雨」が入っている文字列を1に置き換え
for i in range(366):
    s = dataset.iloc[i,7].find('')
    if s == -1:
        dataset.iloc[i,7] = 0
    else:
        dataset.iloc[i,7] = 1

# 数値にばらつきがあるので
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()
dataset_std = sc.fit_transform(dataset)

is_tenki1 = (dataset['tenki1']==0).astype(np.int64)
dataset['is_tenki1'] = is_tenki1

# 目的関数と説明変数の設定
Y = np.array(dataset['is_tenki1'])
X = np.array(dataset[['kion1','kion2','kion3','wind1','wind2','kiatsu','cloud']])
print("Y=", Y.shape, ", X=", X.shape)

# 7:3にデータを学習用とテスト用に分割
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.3, random_state=0)

学習と学習効果

# モデルの初期化
model = keras.Sequential()

# 入力層
model.add(Dense(8, activation='relu', input_shape=(7,)))
# 隠れ層
model.add(Dense(8, activation='relu'))
# 出力層
model.add(Dense(1, activation='sigmoid'))

# モデルの構築
model.compile(optimizer = "rmsprop", loss='binary_crossentropy', metrics=['accuracy'])

%%time
# 学習の実施
log = model.fit(X_train, Y_train, epochs=5000, batch_size=24, verbose=True,
                callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss',
                                                         min_delta=0, patience=100,
                                                         verbose=1)],
         validation_data=(X_valid, Y_valid))

# predictで予測を行う
Y_pred = model.predict(X_test)

# 二値分類は予測結果の確率が0.5以下なら0,
# それより大きければ1となる計算で求める
Y_pred_cls = (Y_pred > 0.5).astype("int32")

Y_pred_ = Y_pred_cls.reshape(-1)
from sklearn.metrics import classification_report

print(classification_report(Y_test, Y_pred_))

image.png

と、そこそこいい成果が出せたと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?