- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 作者:K同学啊
- 电脑系统:Windows 10
- 语言环境:Python 3.8.5
- 编译器:Pycharm 2022.02
- 深度学习环境:TensorFlow 2.10.0
- 显卡及显存:RTX 3060 12G
目录
前言
探索性数据分析
(Exploratory Data Analysis,简称EDA)是指对数据集进行初步探索,以发现数据中存在的模式、异常和趋势,从而帮助研究人员更好地了解数据、熟悉数据、分析数据。
EDA的主要目的是:
-
理解数据的特征:通过描述性统计和可视化方法,了解数据的分布、中心位置、离散程度、异常值等特征,包括数据集中有哪些变量,变量之间的关系如何等。
-
检查数据质量:查看数据集中是否存在缺失值、重复值、异常值等数据质量问题,确保数据的完整性和准确性。
-
确定数据预处理方法:在数据分析前对数据进行预处理,例如特征选择、特征变换、缺失值填充等操作,以提高数据质量和模型预测能力。
数据缺失处理
数据缺失是指数据集中某些数据或变量缺少值或信息,导致不能完整地进行数据分析和建模。在实际应用中,缺失数据是非常常见的情况。处理缺失数据的方法通常包括以下几种:
-
删除缺失数据:如果数据集中缺失的数据较少,可以直接删除缺失数据所在的行或列。这种方法的优点是简单易行,但是可能会损失一些有用的信息。
-
插值填充:插值填充是一种常见的缺失数据处理方法,可以使用插值方法(如线性插值、多项式插值等)来估算缺失值。插值填充的优点是可以保留数据集的完整性,并且能够根据数据集的特点进行估算。但是这种方法也有缺点,因为插值方法依赖于数据分布的假设,可能会引入估计误差。
-
使用固定值填充:将缺失值替换为某个固定值,如平均值、中位数、众数等。这种方法简单易行,但是可能会引入偏差,尤其是在样本中存在较大的异常值时。
-
建立模型进行估算:可以根据已知的数据,建立模型来估算缺失值。例如,可以使用线性回归、K近邻等机器学习方法来预测缺失值。这种方法的优点是可以考虑多个变量之间的关系,但是需要大量的计算和模型选择。
总之,在处理缺失数据时需要根据数据集的特点和应用场景选择合适的方法,避免引入不必要的偏差和误差。
SeaBorn
Seaborn是一个基于Python语言的数据可视化库,专注于统计绘图。其特点包括:
-
内置统计图表:Seaborn内置了许多统计图表,例如散点图、线性回归图、核密度图等,可快速生成数据可视化效果。
-
简洁易用的API:Seaborn提供了简洁易用的API,使得用户能够轻松地生成高质量的统计图表,无需编写复杂的代码。
-
与Pandas数据框兼容:Seaborn能够与Pandas数据框兼容,支持直接使用数据框中的数据进行可视化操作。
-
丰富的可定制化选项:Seaborn提供了许多可定制化选项,包括颜色、字体、标签等,使得用户能够根据需求自定义统计图表。
正是由于seaborn的这些特点,在进行EDA(Exploratory Data Analysis, 探索性数据分析)过程中,seaborn往往更为高效。
一、数据集
二、数据读入
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("/content/weatherAUS.csv")
df = data.copy()
data.head()
data.describe()
data.dtypes
data['Date']=pd.to_datetime(data['Date'])
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',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
y.plot(kind="bar",figsize=(4,3),color=['#006666','#d279a6']);
● 如果今天不下雨,那么明天下雨的机会 = 15%
● 如果今天下雨明天下雨的机会 = 46%
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');
plt.figure(figsize=(8,6))
sns.scatterplot(x='MaxTemp', y='MinTemp', data=data, hue='RainTomorrow');
四.数据预处理
1.处理缺损值
# 每列中缺失数据的百分比
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, size=len(data.index))))
s = (data.dtypes == "object")
object_cols = list(s[s].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()
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.25,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'))
model.summary()
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()
总结
主要介绍了探索性数据分析(EDA)的概念和目的,并介绍了处理缺失数据的方法。同时,还介绍了基于Python语言的数据可视化库Seaborn的特点,并使用Seaborn对一个气象数据集进行了探索性数据分析,包括数据相关性探索、是否会下雨和地理位置与下雨的关系。使用了许多Python库,包括NumPy、Pandas、Seaborn、Matplotlib、Scikit-learn和TensorFlow等。
参考资料
EDA(Explore Data Analysis)一步一步详解_数据eda_juhanishen的博客-CSDN博客
Seaborn入门详细教程 - 知乎