当前位置:   article > 正文

机器学习实战5-天气预测系列:利用数据集可视化分析数据,并预测某个城市的天气情况_机器学习天气预测

机器学习天气预测

大家好,我是微学AI,最近天气真的是多变啊,忽冷忽热,今天再次给大家带来天气的话题,机器学习实战5-天气预测系列,我们将探讨一个城市的气象数据集,并利用机器学习来预测该城市的天气状况。该数据集包含年平均温度和湿度等信息。

一、准备工作

首先,我们需要了解一下数据集中包含哪些信息。原始数据集可能包含多个变量,但我们主要关注年平均温度和湿度这两个因素对天气状况的影响。年平均温度和湿度可以很好地反映该城市的气候状况,因此它们是预测天气状况的重要变量。我们会对数据集中的各种字段进行分析。

在数据预处理和分析完成之后,我们可以使用各种机器学习算法进行预测。这些算法可以分为有监督学习和无监督学习。有监督学习算法需要使用标记数据集进行训练,以生成预测模型。常用的有监督学习算法包括线性回归、决策树、随机森林、向量机分类模型(SVC算法)等。无监督学习算法则不需要标记数据集,而是通过发现数据集中的潜在规律进行预测。常用的无监督学习算法包括聚类、降维等。本文采用向量机分类模型进行分类预测。

 二、代码实践

1.数据导入

  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import seaborn as sns
  4. plt.rcParams['font.sans-serif']=['SimHei']
  5. df = pd.read_csv('weather_dataset.csv')
  6. labels = pd.read_csv('weather_labels.csv')

我们将导入数据,数据的获取链接:链接:https://pan.baidu.com/s/1lxdjR5-URwYPWzRkSYizVg?pwd=ave6 
提取码:ave6

数据样例:

DATEMONTHBASEL_cloud_coverBASEL_humidityBASEL_pressureBASEL_global_radiationBASEL_precipitationBASEL_sunshineBASEL_temp_meanBASEL_temp_minBASEL_temp_maxBUDAPEST_cloud_coverBUDAPEST_humidityBUDAPEST_pressure
20000101180.891.02860.20.0302.91.63.930.921.0268
20000102180.871.03180.25003.62.74.880.941.0297
20000103150.811.03140.503.72.20.14.860.951.0295
20000104170.791.02620.630.356.93.90.57.580.941.0252
20000105150.91.02460.510.073.763.88.650.881.0235
20000106130.851.02440.5605.74.21.96.950.891.026
20000107180.841.02670.2004.71.86.2811.0299
20000108140.791.02480.5404.35.64.18.480.971.0302
20000109180.881.02430.110.6504.63.85.780.951.0289
20000110180.911.03370.060.0902.41.43.860.891.0323
20000111180.881.03730.06003.22.63.970.861.0381
20000112180.771.03190.1002.40.8360.781.0378

2.2000年的温度变化图

  1. df_budapest = pd.concat([df.iloc[:,:2],df.iloc[:,11:19]],axis=1)
  2. df_budapest['DATE'] = pd.to_datetime(df_budapest['DATE'],format='%Y%m%d')
  3. def mean_for_mth(feature):
  4. mean = []
  5. for x in range(12):
  6. mean.append(
  7. float("{:.2f}".format(df_budapest[df_budapest['MONTH'] == (x+1)][feature].mean())))
  8. return mean
  9. df_budapest.drop(['MONTH'],axis=1).describe()
  10. #sns.set(style="darkgrid")
  11. plt.figure(figsize=(12,6))
  12. plt.plot(df_budapest['DATE'][:365],df_budapest['BUDAPEST_temp_mean'][:365])
  13. plt.title('2000年的温度变化图')
  14. plt.xlabel('DATE')
  15. plt.ylabel('DEGREE')
  16. plt.show()

3.布达佩斯(匈牙利首都)年平均温度

  1. months = ['Jan', 'Febr', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
  2. 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
  3. mean_temp = mean_for_mth('BUDAPEST_temp_mean')
  4. plt.figure(figsize=(12,6))
  5. bar = plt.bar(x = months,height = mean_temp, width = 0.8, color=['thistle','mediumaquamarine', 'orange'])
  6. plt.xticks(rotation = 45)
  7. plt.xlabel('MONTHS')
  8. plt.ylabel('DEGREES')
  9. plt.title('布达佩斯(匈牙利首都)年平均温度')
  10. plt.bar_label(bar)
  11. plt.show()

4.布达佩斯(匈牙利首都)的年平均湿度

  1. mean_temp = mean_for_mth('BUDAPEST_humidity')
  2. plt.figure(figsize=(12,6))
  3. bar = plt.bar(x = months, height = mean_temp, width = 0.8, color=['thistle','mediumaquamarine', 'orange'])
  4. plt.xticks(rotation = 45)
  5. plt.xlabel('MONTHS')
  6. plt.ylabel('HUMIDITY')
  7. plt.title('布达佩斯(匈牙利首都)的年平均湿度')
  8. plt.bar_label(bar)
  9. plt.show()

5.各指标的分布次数图

  1. fig, axs = plt.subplots(2, 2, figsize=(12,8))
  2. fig.suptitle('各指标的分布次数图')
  3. sns.histplot(data = df_budapest, x ='BUDAPEST_pressure', ax=axs[0,0], color='red', kde=True)
  4. sns.histplot(data = df_budapest, x ='BUDAPEST_humidity', ax=axs[0,1], color='orange', kde=True)
  5. sns.histplot(data = df_budapest, x ='BUDAPEST_temp_mean', ax=axs[1,0], kde=True)
  6. sns.histplot(data = df_budapest, x ='BUDAPEST_global_radiation', ax=axs[1,1], color='green', kde=True)
  7. plt.show()

6. 分析天气标签提供一些基本的数据探索和采样策略

针对数据进行了一些数据探索和取样,具体包括以下步骤:

1.统计 天气标签(labels)的数量分布并使用 seaborn 绘制了计数图;

2.计算天气标签(labels)为真和为假的百分比;

3.将 天气标签转换为整数,并使用 seaborn 绘制了标签(labels)与温度的关系;

4.统计了过采样后的天气标签(labels)的数量分布并使用 seaborn 绘制了计数图;

5.绘制了数据集的特征之间的相关性热图。

  1. labels_budapest = labels['BUDAPEST_BBQ_weather']
  2. sns.set(style="darkgrid")
  3. plt.figure(figsize=(12,6))
  4. sns.countplot(x = labels_budapest).set(title='Labels for BUDAPEST')
  5. true_val = len(labels_budapest[labels_budapest == True])
  6. false_val = len(labels_budapest[labels_budapest == False])
  7. print('Precent of True values: {0:.2f}%'.format(true_val/(true_val+false_val)*100))
  8. print('Precent of False values: {0:.2f}%'.format(false_val/(true_val+false_val)*100))
  9. labels_budapest = labels_budapest.astype(int)
  10. plt.figure(figsize=(12,6))
  11. sns.set(style="darkgrid")
  12. sns.boxplot(y = df_budapest['BUDAPEST_temp_mean'], x = labels_budapest).set(title='Relation between the temperature and the bbq weather')
  13. labels_budapest = labels_budapest.astype(int)
  14. df_budapest = df_budapest.drop(['DATE'],axis=1)
  15. from imblearn.over_sampling import RandomOverSampler
  16. oversample = RandomOverSampler()
  17. ovrspl_X, ovrspl_y = oversample.fit_resample(df_budapest, labels_budapest)
  18. labels_budapest = labels['BUDAPEST_BBQ_weather']
  19. sns.set(style="darkgrid")
  20. plt.figure(figsize=(12,6))
  21. sns.countplot(x = ovrspl_y).set(title='Oversampled Labels for BUDAPEST')
  22. true_val = len(ovrspl_y[ovrspl_y == 1])
  23. false_val = len(ovrspl_y[ovrspl_y == 0])
  24. print('Precent of True values: {0:.1f}%'.format(true_val/(true_val+false_val)*100))
  25. print('Precent of False values: {0:.1f}%'.format(false_val/(true_val+false_val)*100))
  26. plt.figure(figsize=(12,6))
  27. sns.set(style="darkgrid")
  28. sns.heatmap(df_budapest.corr(),annot=True,cmap='coolwarm').set(title='Correlation between features')
  29. plt.show()

 

 

 

7. 基于SVC模型的机器学习预测天气分类

  1. from sklearn.preprocessing import MinMaxScaler
  2. scaler = MinMaxScaler()
  3. norm_X = scaler.fit_transform(ovrspl_X)
  4. norm_X = pd.DataFrame(norm_X, columns=df_budapest.columns)
  5. norm_X.describe()
  6. from sklearn.model_selection import train_test_split
  7. # Splitting dataset on training and testing datasets
  8. X_train, X_test, y_train, y_test = train_test_split(ovrspl_X,ovrspl_y, test_size = 0.3, random_state = 42)
  9. print('Training set: ' + str(len(X_train)))
  10. print('Testing set: ' + str(len(X_test)))
  11. from sklearn.svm import SVC
  12. model = SVC(verbose=True, kernel = 'linear', random_state = 0)
  13. model.fit(X_train,y_train)
  14. y_predict = model.predict(X_test)
  15. from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
  16. print('Classification report--------------------------------')
  17. print(classification_report(y_test,y_predict))
  18. sns.heatmap(confusion_matrix(y_test,y_predict), annot=True, fmt='g').set(title='Confusion Matrix')
  19. print('Model accuracy is: {0:.2f}%'.format(accuracy_score(y_test, y_predict)*100))

 运行结果:

  1. Training set: 3235
  2. Testing set: 1387
  3. [LibSVM]................................*...............................*................................................*
  4. optimization finished, #iter = 110434
  5. obj = -581.485644, rho = -4.010761
  6. nSV = 647, nBSV = 635
  7. Total nSV = 647
  8. Classification report--------------------------------
  9. precision recall f1-score support
  10. 0 0.98 0.91 0.95 712
  11. 1 0.92 0.98 0.95 675
  12. accuracy 0.95 1387
  13. macro avg 0.95 0.95 0.95 1387
  14. weighted avg 0.95 0.95 0.95 1387
  15. Model accuracy is: 94.66%

文章结束,欢迎大家咨询与合作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/156169
推荐阅读
相关标签
  

闽ICP备14008679号