- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍦 参考文章:365天深度学习训练营-第8周:猫狗识别(训练营内部成员可读)
- 🍖 原作者:K同学啊|接辅导、项目定制
● 难度:夯实基础⭐⭐
● 语言:Python3、TensorFlow2
● 时间:9月12-9月16日
一,导入模块设置GPU
import tensorflow as tf
gpus=tf.config.experimental.list_physical_devices(device_type='GPU')#获得主机某种运算设备类型如GPU/CPU.(config.experiment)实验配置
tf.config.experimental.set_visible_devices(devices=gpus[0],device_type='GPU')#只使用程序可见的设备,不可见的该程序不会使用
print(gpus)#查看工作的gpu
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')#忽略警告
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler#将数据的每一个特征缩放到给定的范围,scaler(定标器)将数据的每一个属性值减去其最小值,然后除以其极差(最大值 - 最小值)
from tensorflow.keras.models import Sequential#Sequential继承module用来搭建网络层的传参容器,具有连续性Sequential(连续)
from tensorflow.keras.layers import Dense,Activation,Dropout
from tensorflow.keras.callbacks import EarlyStopping#回调函数是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。
from sklearn.metrics import classification_report,confusion_matrix#metrics(度量)引入分类报告,混淆矩阵
from sklearn.metrics import r2_score# 表示一元多项式回归方程拟合度的高低,或者说表示一元多项式回归方程估测的可靠程度的高低。
from sklearn.metrics import mean_absolute_error,mean_absolute_percentage_error,mean_squared_error
二,导入数据
data=pd.read_csv('weatherAUS.csv')
data.head()
df=data.copy()#copy() 方法返回 DataFrame 的副本。默认情况下,副本是一个 "深度复制" 这意味着在原始 DataFrame 中所做的任何更改都不会影响副本。
data.info()#Pandas dataframe.info()函数用于获取 DataFrame 的简要摘要。在对数据进行探索性分析时,它非常方便。为了快速浏览数据集,我们使用dataframe.info()函数。
data.describe()#describe()函数可以查看DataFrame中数据的基本情况
Date | Location | MinTemp | MaxTemp | Rainfall | Evaporation | Sunshine | WindGustDir | WindGustSpeed | WindDir9am | ... | Pressure3pm | Cloud9am | Cloud3pm | Temp9am | Temp3pm | RainToday | RainTomorrow | year | Month | day | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2008-12-01 | Albury | 13.4 | 22.9 | 0.6 | NaN | NaN | W | 44.0 | W | ... | 1007.1 | 8.0 | NaN | 16.9 | 21.8 | No | No | 2008 | 12 | 1 |
1 | 2008-12-02 | Albury | 7.4 | 25.1 | 0.0 | NaN | NaN | WNW | 44.0 | NNW | ... | 1007.8 | NaN | NaN | 17.2 | 24.3 | No | No | 2008 | 12 | 2 |
2 | 2008-12-03 | Albury | 12.9 | 25.7 | 0.0 | NaN | NaN | WSW | 46.0 | W | ... | 1008.7 | NaN | 2.0 | 21.0 | 23.2 | No | No | 2008 | 12 | 3 |
3 | 2008-12-04 | Albury | 9.2 | 28.0 | 0.0 | NaN | NaN | NE | 24.0 | SE | ... | 1012.8 | NaN | NaN | 18.1 | 26.5 | No | No | 2008 | 12 | 4 |
4 | 2008-12-05 | Albury | 17.5 | 32.3 | 1.0 | NaN | NaN | W | 41.0 | ENE | ... | 1006.0 | 7.0 | 8.0 | 17.8 | 29.7 | No | No | 2008 | 12 | 5 |
三,EDA(Exploratory Data Analysis)数据相关性分析
3.1关系矩阵
EDA具体过程:
1,数据总览
2,查看数据缺失和异常
3,查看预测值的分布
4,把特征分成类别特征、数值特征,然后对这两种种特征进行更细致的分析
plt.figure(figsize=(15,13))#heatmap(热力图)是识别预测变量与目标变量相关性的方法,同时,也是发现变量间是否存在多重共线性的好方法。
ax=sns.heatmap(data.corr(), square=True, annot=True, fmt='.2f')#data.corr()表示了data中的两个变量之间的相关性
ax.set_xticklabels(ax.get_xticklabels(), rotation=90) #rotation=90将标注旋转90°
plt.show()
3.2是否下雨
sns.set(style="darkgrid")
plt.figure(figsize=(4,3))
sns.countplot(x='RainTomorrow',data=data)
plt.figure(figsize=(4,3))
sns.countplot(x='RainToday',data=data)
y.plot(kind="bar",figsize=(4,3),color=['#006666','#d279a6']);
3.3地理位置与下雨的关系
x=pd.crosstab(data['Location'],data['RainToday'])
# 获取每个城市下雨天数和非下雨天数的百分比
y=x/x.transpose().sum().values.reshape((-1, 1))*100
# 按每个城市的雨天百分比排序
y=y.sort_values(by='Yes',ascending=True )
y
color=['#cc6699','#006699','#006666','#862d86','#ff9966' ]
y.Yes.plot(kind="barh",figsize=(15,20),color=color)
3.4湿度和压力对下雨的影响
plt.figure(figsize=(18,4))
plt.subplot(1,3,1)
sns.scatterplot(data=data,x='Pressure9am',y='Pressure3pm',hue='RainTomorrow');
plt.subplot(1,3,2)
sns.scatterplot(data=data,x='Humidity9am',y='Humidity3pm',hue='RainTomorrow');
plt.subplot(1,3,3)
sns.scatterplot(x='MaxTemp', y='MinTemp', data=data, hue='RainTomorrow');
plt.show()
四,搭建神经网络
4.1LSTM模型
# 每列中缺失数据的百分比
data.isnull().sum()/data.shape[0]*100
print(data.isnull())
# 在该列中随机选择数进行填充
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, size=len(data.index))))
s = (data.dtypes == "object")
x = [float(s) for s in x]
object_cols = list(x[x].index)
object_cols
# inplace=True:直接修改原对象,不创建副本
# data[i].mode()[0] 返回频率出现最高的选项,众数
for i in object_cols:
data[i].fillna(data[i].mode()[0], inplace=True)
t = (data.dtypes == "float64")
num_cols = list(t[t].index)
num_cols
# .median(), 中位数
for i in num_cols:
data[i].fillna(data[i].median(), inplace=True)
data.isnull().sum()
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'], axis=1).values
y = data['RainTomorrow'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=101)
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(units=24,activation='tanh',))
model.add(Dense(units=18,activation='tanh'))
model.add(Dense(units=23,activation='tanh'))
model.add(Dropout(0.5))
model.add(Dense(units=12,activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(units=1,activation='sigmoid'))
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)
model.compile(loss='binary_crossentropy',
optimizer=optimizer,
metrics="accuracy")
''''model.add(Dense(units, #输出的大小(神经元个数)
activation=None, #激活函数
use_bias=True, #是否添加偏置
kernel_initializer='glorot_uniform', #权重矩阵初始化
bias_initializer='zeros', #偏置初始化
kernel_regularizer=None, #权重矩阵的正则函数
bias_regularizer=None,) #偏置的的正则函数
)'''
early_stop = EarlyStopping(monitor='val_loss',
mode='min',
min_delta=0.001,
verbose=1,
patience=25,
restore_best_weights=True)
model.fit(x=X_train,
y=y_train,
validation_data=(X_test, y_test), verbose=1,
callbacks=[early_stop],
epochs = 10,
batch_size = 32
)
4.2 loss,acc曲线
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, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()