r5:天气预测
- ** 本文为[365天深度学习训练营](https://mp.weixin.qq.com/s/o-DaK6aQQLkJ8uE4YX1p3Q) 中的学习记录博客**- ** 原作者[K同学啊](https://mtyjkh.blog.csdn.net/)**文章目录概要整体架构流程代码运行技术名词解释小结概要根据今天的天气数据预测明天是否会下雨Yes/No。这是一个典型的二分类问题。整体架构流程原始数据 (weatherAUS.csv)↓第一步数据探索 (EDA)↓第二步数据预处理↓第三步构建数据集↓第四步搭建神经网络↓第五步训练模型↓第六步结果可视化数据探索data.head() → 看前几行数据data.describe() → 看统计摘要data.dtypes → 看每列数据类型热力图 → 看各特征之间的相关性countplot → 看下雨/不下雨的数量分布crosstab → 看今天下雨和明天下雨的关联城市降雨率图 → 看哪些城市更容易下雨散点图 → 看气压和降雨的关系数据预处理问题1Date是字符串→ 解决拆分成year/Month/day三列数字问题2有缺失值→ 解决文本列 → 众数填充数值列 → 中位数填充特殊列 → 随机抽样填充问题3文本列模型不能用→ 解决LabelEncoder编码成数字Adelaide→0, Albany→1 ...问题4各列数值范围差异大→ 解决MinMaxScaler归一化到0~1构建数据集X特征 除RainTomorrow和day之外的所有列↓今天的气温、气压、风速、湿度...y标签 RainTomorrow列↓明天是否下雨0或1然后X, y → train_test_split → X_train, X_testy_train, y_test75%训练集 25%测试集搭建神经网络输入层接收今天的天气数据多个特征↓隐藏层124个神经元tanh激活学习特征组合↓隐藏层218个神经元tanh激活进一步提取规律↓隐藏层323个神经元tanh激活↓Dropout(0.5)随机关闭50%神经元防止过拟合↓隐藏层412个神经元tanh激活↓Dropout(0.2)随机关闭20%神经元↓输出层1个神经元sigmoid激活输出0~1的概率0.5 → 明天下雨(Yes)0.5 → 明天不下雨(No)代码运行import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import warnings warnings.filterwarnings(ignore) from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Activation, Dropout from tensorflow.keras.callbacks import EarlyStopping from sklearn.metrics import classification_report, confusion_matrix from sklearn.metrics import r2_score from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error data pd.read_csv(/Users/lilyj/Downloads/weatherAUS.csv) df data.copy() # 保留原始数据备份 data.head() # 查看前5行data.describe()data.dtypesdata[Date] pd.to_datetime(data[Date]) # 字符串 → 日期格式 data[year] data[Date].dt.year data[Month] data[Date].dt.month data[day] data[Date].dt.day data.head()data.drop(Date, axis1, inplaceTrue) # 拆分完后删除原始Date列 data.columns # 查看当前所有列名plt.figure(figsize(15, 13)) ax sns.heatmap(data.corr(numeric_onlyTrue), # 只对数值列计算忽略字符串列 squareTrue, # 每个格子都是正方形 annotTrue, # 在每个格子里显示具体数值 fmt.2f) # 显示数值保留两位小数 ax.set_xticklabels(ax.get_xticklabels(), rotation90) # 旋转x轴标签90度避免重叠 plt.show()sns.set(stylewhitegrid, paletteSet2) # whitegrid → 白色背景 横向网格线Set2 → 柔和配色自动分配给不同类别 fig, axes plt.subplots(1, 2, figsize(10, 4)) # 1 行 2 列 title_font {fontsize: 14, fontweight: bold, color: darkblue} # 左图RainTomorrow sns.countplot(xRainTomorrow, datadata, hueRainTomorrow, paletteSet2, axaxes[0], # ← 必须指定画在哪个子图 edgecolorblack) # 给柱子加上黑色边框更清晰 axes[0].set_title(Rain Tomorrow, fontdicttitle_font) axes[0].set_xlabel(Will it Rain Tomorrow?, fontsize12) axes[0].set_ylabel(Count, fontsize12) # 右图RainToday sns.countplot(xRainToday, datadata, hueRainToday, paletteSet2, axaxes[1], # ← 同样要指定 edgecolorblack) axes[1].set_title(Rain Today, fontdicttitle_font) axes[1].set_xlabel(Did it Rain Today?, fontsize12) axes[1].set_ylabel(Count, fontsize12) sns.despine() plt.tight_layout() plt.show()x pd.crosstab(data[RainTomorrow], data[RainToday]) xy x / x.transpose().sum().values.reshape(2,1) * 100 yy.plot(kindbar, figsize(4,3), color[#006666,#d279a6])x pd.crosstab(data[Location], data[RainToday]) y x / x.transpose().sum().values.reshape(-1, 1) * 100 # 每行归一化为百分比 y y.sort_values(byYes, ascendingTrue) # 按下雨率升序排列 color [#cc6699,#006699,#006666,#862d86,#ff9966] y.Yes.plot(kindbarh, figsize(15,20), colorcolor) # 水平柱状图data.columnsplt.figure(figsize(8, 6)) sns.scatterplot(datadata, xPressure9am, yPressure3pm, hueRainTomorrow)data.isnull().sum()/data.shape[0]*100 lst [Evaporation, Sunshine, Cloud9am, Cloud3pm] for col in lst: fill_list data[col].dropna() data[col] data[col].fillna(pd.Series(np.random.choice(fill_list, sizelen(data)))) s (data.dtypes object) object_cols list(s[s].index) object_cols for i in object_cols: data[i].fillna(data[i].mode()[0], inplaceTrue) # inplaceTrue直接修改原数据不需要重新赋值 t (data.dtypes float64) num_cols list(t[t].index) # .median()中位数 for i in num_cols: data[i].fillna(data[i].median(), inplaceTrue) from sklearn.preprocessing import LabelEncoder label_encoder LabelEncoder() for i in object_cols: data[i] label_encoder.fit_transform(data[i]) X data.drop([RainTomorrow, day], axis1).values y data[RainTomorrow].values X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.25, random_state42) scaler MinMaxScaler() scaler.fit(X_train) # 只用训练集计算最大最小值 X_train scaler.transform(X_train) # 训练集归一化 X_test scaler.transform(X_test) # 测试集用同样的标准归一 from tensorflow.keras.optimizers import Adam model Sequential() model.add(Dense(units24, activationtanh)) model.add(Dense(units18, activationtanh)) model.add(Dense(units23, activationtanh)) model.add(Dropout(0.5)) model.add(Dense(units12, activationtanh)) model.add(Dropout(0.2)) model.add(Dense(units1, activationsigmoid)) optimizer tf.keras.optimizers.Adam(learning_rate1e-4) model.compile(lossbinary_crossentropy, optimizeroptimizer, metrics[accuracy]) early_stop EarlyStopping(monitorval_loss, modemin, min_delta0.001, verbose1, patience25, restore_best_weightsTrue) model.fit(xX_train, yy_train, validation_data(X_test, y_test), verbose1, callbacks[early_stop], epochs10, batch_size32)import matplotlib.pyplot as plt acc model.history.history[accuracy] val_acc model.history.history[val_accuracy] loss model.history.history[loss] val_loss model.history.history[val_loss] epochs_range range(10) plt.figure(figsize(14, 4)) # 左图准确率曲线 plt.subplot(1, 2, 1) plt.plot(epochs_range, acc, labelTraining Accuracy) plt.plot(epochs_range, val_acc, labelValidation Accuracy) plt.legend(loclower right) plt.title(Training and Validation Accuracy) # 右图损失曲线 plt.subplot(1, 2, 2) plt.plot(epochs_range, loss, labelTraining Loss) plt.plot(epochs_range, val_loss, labelValidation Loss) plt.legend(locupper right) plt.title(Training and Validation Loss) plt.show()小结收集澳大利亚各城市的历史天气数据 → 清洗处理 → 喂给神经网络学习 → 神经网络找到今天天气特征和明天是否下雨之间的规律→ 用这个规律预测未来是否下雨
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2472410.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!