目录

前言

探索性数据分析

数据缺失处理

一、数据读入

二、探索性数据分析EDA

        1.数据相关性探索

        2.是否会下雨

        3.地理位置和下雨的关系

        4.压力、湿度、温度对下雨的影响

        5. 气温对下雨的影响

三.数据预处理

        1.处理缺损值

        2.构建数据集

五、预测是否下雨

        1、搭建神经网络

        2、模型训练

​        3、模型评估

前言

探索性数据分析

EDA的主要目的是做出任何假设之前帮助观察数据。它可以帮助识别明显的错误,以及更好地理解数据中的模式,检测异常值或异常事件,找到变量间的关系。

数据缺失处理

什么是缺失值?
缺失值是指粗糙数据中由于缺少信息而造成的数据缺失或截断,导致现有数据集中某个或某些属性的值不完全。缺失值不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值。
在实际业务中,数据往往都是来自不同的系统或业务部门,缺乏统一的标准和机制,结构多样的海量的数据汇集在一起,很容易出现有缺失值的情况。

处理缺失数据的方法通常包括以下几种:

删除缺失数据:如果数据集中缺失的数据较少,可以直接删除缺失数据所在的行或列。这种方法的优点是简单易行,但是可能会损失一些有用的信息。

插值填充:插值填充是一种常见的缺失数据处理方法,可以使用插值方法(如线性插值、多项式插值等)来估算缺失值。插值填充的优点是可以保留数据集的完整性,并且能够根据数据集的特点进行估算。但是这种方法也有缺点,因为插值方法依赖于数据分布的假设,可能会引入估计误差。

使用固定值填充:将缺失值替换为某个固定值,如平均值、中位数、众数等。这种方法简单易行,但是可能会引入偏差,尤其是在样本中存在较大的异常值时。

建立模型进行估算:可以根据已知的数据,建立模型来估算缺失值。例如,可以使用线性回归、K近邻等机器学习方法来预测缺失值。这种方法的优点是可以考虑多个变量之间的关系,但是需要大量的计算和模型选择。

总之,在处理缺失数据时需要根据数据集的特点和应用场景选择合适的方法,避免引入不必要的偏差和误差。

一.数据读入

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 , mean_squared_error
data = pd.read_csv("E:/谷歌下载/weatherAUS.csv")
df   = data.copy()
#data.head()  #返回data的前几行数据,默认为前五行,需要前十行则data.head(10)
#data.tail()  #返回data的后几行数据,默认为后五行,需要后十行则data.tail(10)
data.head(10)

# data.describe( ):
# describe() 函数可以查看数据的基本情况,包括:count 非空值数、mean 平均值、std 标准差、max 最大值、min 最小值、(25%、50%、75%)分位数等。
# len(data) 是数据的记录数
data.describe()

#查看数据属性和类型
#通过DATa Frame的Type属性来查看每一个字段的数据类型
data.dtypes

data['Date']=pd.to_datetime(data['Date'])
#pd.to_datetime是Pandas库中的函数,可以将字符串转换为Timestamp格式,并且可以转换多种格式的时间字符串。
data['Date']

data['year']=data['Date'].dt.year
data['Month']=data['Date'].dt.month
data['day']=data['Date'].dt.day
data.head(10)

data.drop('Date',inplace=True,axis=1)
data.columns

二、探索性数据分析EDA

1.数据相关性探索

plt.figure(figsize=(15,13))
# data.corr()表示了data中的两个变量之间的相关性
ax = sns.heatmap(data.corr(), square=True, annot=True, fmt='.2f')
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)          
plt.show()

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)

x=pd.crosstab(data['RainTomorrow'],data['RainToday'])
x

y=x/x.transpose().sum().values.reshape(2,1)*100
y
#如果今天不下雨,那么明天下雨的机会 = 53.22% 如果今天下雨明天下雨的机会 = 46.7%

y.plot(kind="bar",figsize=(4,3),color=['#006666','#d279a6']);

3.地理位置和下雨的关系

x=pd.crosstab(data['Location'],data['RainToday']) 
# 获取每个城市下雨天数和非下雨天数的百分比
x

y=x/x.sum(axis=1).values.reshape((-1, 1))*100
# 按每个城市的雨天百分比排序
y=y.sort_values(by='Yes',ascending=True )
 
color=['#cc6699','#006699','#006666','#862d86','#ff9966'  ]
y.Yes.plot(kind="barh",figsize=(15,20),color=color)
#位置影响下雨,对于 Portland 来说,有 36% 的时间在下雨,而对于 Woomera来说,只有6%的时间在下雨。

4.压力、湿度、温度对下雨的影响

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Pressure9am',y='Pressure3pm',hue='RainTomorrow');

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Humidity9am',y='Humidity3pm',hue='RainTomorrow');

5. 气温对下雨的影响

plt.figure(figsize=(8,6))
sns.scatterplot(x='MaxTemp', y='MinTemp', data=data, hue='RainTomorrow');

三.数据预处理

1.处理缺损值

# 每列中缺失数据的百分比
data.isnull().sum()/data.shape[0]*100

#类型填充 object
s = (data.dtypes == "object")
object_cols = list(s[s].index)
# inplace=True:直接修改原对象,不创建副本
# data[i].mode()[0] 返回频率出现最高的选项,众数
 
for i in object_cols:
    data[i].fillna(data[i].mode()[0], inplace=True)
object_cols

#类型填充 float
t = (data.dtypes == "float64")
num_cols = list(t[t].index)
# .median(), 中位数
for i in num_cols:
    data[i].fillna(data[i].median(), inplace=True)
num_cols

填充后的数据

2.构建数据集

 
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.2,random_state=101)
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test  = scaler.transform(X_test)

五、预测是否下雨

1、搭建神经网络

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")
              
early_stop = EarlyStopping(monitor='val_loss', 
                           mode='min',
                           min_delta=0.001, 
                           verbose=1, 
                           patience=25,
                           restore_best_weights=True)

2、模型训练

model.fit(x=X_train, 
          y=y_train, 
          validation_data=(X_test, y_test), verbose=1,
          callbacks=[early_stop],
          epochs = 10,
          batch_size = 32
)

3、模型评估

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()

更多推荐