基于机器学习预测未来的二氧化碳排放量(随机森林和XGBoost)

简介:

CO2排放是当今全球关注的环境问题之一。本文将使用Python对OWID提供的CO2排放数据集进行分析,并尝试构建机器学习模型来预测未来的CO2排放趋势。我们将探索数据集中的CO2排放情况,分析各国/地区的排放趋势,并利用机器学习算法来预测未来的CO2排放量。

1. 数据集介绍:

我们使用的数据集是OWID(Our World in Data)提供的CO2排放数据集。该数据集包含了各国/地区自1949年至2020年的CO2排放量以及相关的经济、人口等数据。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
dataset = pd.read_csv('owid-co2-data.csv')
print(dataset.head()) #显示数据集的前5行。 
print(dataset.shape) #显示数据集的行数和列数
  iso_code      country  year    co2  consumption_co2  co2_growth_prct  \
0      AFG  Afghanistan  1949  0.015              NaN              NaN   
1      AFG  Afghanistan  1950  0.084              NaN            475.0   
2      AFG  Afghanistan  1951  0.092              NaN              8.7   
3      AFG  Afghanistan  1952  0.092              NaN              0.0   
4      AFG  Afghanistan  1953  0.106              NaN             16.0   

   co2_growth_abs  trade_co2  co2_per_capita  consumption_co2_per_capita  ...  \
0             NaN        NaN           0.002                         NaN  ...   
1           0.070        NaN           0.011                         NaN  ...   
2           0.007        NaN           0.012                         NaN  ...   
3           0.000        NaN           0.012                         NaN  ...   
4           0.015        NaN           0.013                         NaN  ...   

   ghg_per_capita  methane  methane_per_capita  nitrous_oxide  \
0             NaN      NaN                 NaN            NaN   
1             NaN      NaN                 NaN            NaN   
2             NaN      NaN                 NaN            NaN   
3             NaN      NaN                 NaN            NaN   
4             NaN      NaN                 NaN            NaN   

   nitrous_oxide_per_capita  population           gdp  \
0                       NaN   7624058.0           NaN   
1                       NaN   7752117.0  9.421400e+09   
2                       NaN   7840151.0  9.692280e+09   
3                       NaN   7935996.0  1.001732e+10   
4                       NaN   8039684.0  1.063052e+10   

   primary_energy_consumption  energy_per_capita  energy_per_gdp  
0                         NaN                NaN             NaN  
1                         NaN                NaN             NaN  
2                         NaN                NaN             NaN  
3                         NaN                NaN             NaN  
4                         NaN                NaN             NaN  

[5 rows x 58 columns]
(25204, 58)

2. 数据预处理:

df = dataset.drop(columns=[ 'consumption_co2','co2_growth_prct','co2_growth_abs' ])
df.head()
iso_code country year co2 trade_co2 co2_per_capita consumption_co2_per_capita share_global_co2 cumulative_co2 share_global_cumulative_co2 ... ghg_per_capita methane methane_per_capita nitrous_oxide nitrous_oxide_per_capita population gdp primary_energy_consumption energy_per_capita energy_per_gdp
0 AFG Afghanistan 1949 0.015 NaN 0.002 NaN 0.0 0.015 0.0 ... NaN NaN NaN NaN NaN 7624058.0 NaN NaN NaN NaN
1 AFG Afghanistan 1950 0.084 NaN 0.011 NaN 0.0 0.099 0.0 ... NaN NaN NaN NaN NaN 7752117.0 9.421400e+09 NaN NaN NaN
2 AFG Afghanistan 1951 0.092 NaN 0.012 NaN 0.0 0.191 0.0 ... NaN NaN NaN NaN NaN 7840151.0 9.692280e+09 NaN NaN NaN
3 AFG Afghanistan 1952 0.092 NaN 0.012 NaN 0.0 0.282 0.0 ... NaN NaN NaN NaN NaN 7935996.0 1.001732e+10 NaN NaN NaN
4 AFG Afghanistan 1953 0.106 NaN 0.013 NaN 0.0 0.388 0.0 ... NaN NaN NaN NaN NaN 8039684.0 1.063052e+10 NaN NaN NaN

5 rows × 55 columns

df1 = df[['country', 'year','co2','coal_co2','cement_co2', 'flaring_co2','gas_co2','oil_co2', 'other_industry_co2','methane', 'nitrous_oxide', 'population' ]]
df1
country year co2 coal_co2 cement_co2 flaring_co2 gas_co2 oil_co2 other_industry_co2 methane nitrous_oxide population
0 Afghanistan 1949 0.015 0.015 NaN NaN NaN NaN NaN NaN NaN 7624058.0
1 Afghanistan 1950 0.084 0.021 NaN NaN NaN 0.063 NaN NaN NaN 7752117.0
2 Afghanistan 1951 0.092 0.026 NaN NaN NaN 0.066 NaN NaN NaN 7840151.0
3 Afghanistan 1952 0.092 0.032 NaN NaN NaN 0.060 NaN NaN NaN 7935996.0
4 Afghanistan 1953 0.106 0.038 NaN NaN NaN 0.068 NaN NaN NaN 8039684.0
... ... ... ... ... ... ... ... ... ... ... ... ...
25199 Zimbabwe 2016 10.738 6.959 0.639 NaN NaN 3.139 NaN 11.92 6.55 14030338.0
25200 Zimbabwe 2017 9.582 5.665 0.678 NaN NaN 3.239 NaN NaN NaN 14236599.0
25201 Zimbabwe 2018 11.854 7.101 0.697 NaN NaN 4.056 NaN NaN NaN 14438812.0
25202 Zimbabwe 2019 10.949 6.020 0.697 NaN NaN 4.232 NaN NaN NaN 14645473.0
25203 Zimbabwe 2020 10.531 6.257 0.697 NaN NaN 3.576 NaN NaN NaN 14862927.0

25204 rows × 12 columns

final_df = df1[df1['year' ]>1995]
final_df
country year co2 coal_co2 cement_co2 flaring_co2 gas_co2 oil_co2 other_industry_co2 methane nitrous_oxide population
47 Afghanistan 1996 1.165 0.007 0.047 0.022 0.308 0.780 NaN 9.93 3.29 18853444.0
48 Afghanistan 1997 1.084 0.004 0.047 0.022 0.283 0.728 NaN 10.60 3.59 19357126.0
49 Afghanistan 1998 1.029 0.004 0.047 0.022 0.265 0.691 NaN 11.10 3.88 19737770.0
50 Afghanistan 1999 0.810 0.004 0.047 0.022 0.242 0.495 NaN 11.87 4.15 20170847.0
51 Afghanistan 2000 0.758 0.004 0.010 0.022 0.224 0.498 NaN 10.59 3.62 20779957.0
... ... ... ... ... ... ... ... ... ... ... ... ...
25199 Zimbabwe 2016 10.738 6.959 0.639 NaN NaN 3.139 NaN 11.92 6.55 14030338.0
25200 Zimbabwe 2017 9.582 5.665 0.678 NaN NaN 3.239 NaN NaN NaN 14236599.0
25201 Zimbabwe 2018 11.854 7.101 0.697 NaN NaN 4.056 NaN NaN NaN 14438812.0
25202 Zimbabwe 2019 10.949 6.020 0.697 NaN NaN 4.232 NaN NaN NaN 14645473.0
25203 Zimbabwe 2020 10.531 6.257 0.697 NaN NaN 3.576 NaN NaN NaN 14862927.0

6073 rows × 12 columns

final_df = final_df[(final_df['country'].isin(['United States', 'Africa', 'Antartica','South Korea', 'Bangladesh', 'Canada', 'Germany', 'Brazil', 'Argentina','Japan', 'India', 'United Kingdom', 'Saudi Arabia', 'China', 'Australia','Russia']) & (final_df['co2'] > 0))]
final_df
country year co2 coal_co2 cement_co2 flaring_co2 gas_co2 oil_co2 other_industry_co2 methane nitrous_oxide population
184 Africa 1996 783.254 353.130 27.681 23.787 108.019 270.637 NaN NaN NaN 735361106.0
185 Africa 1997 812.903 360.837 28.350 23.394 95.205 305.117 NaN NaN NaN 753737584.0
186 Africa 1998 838.022 355.514 29.203 22.961 112.712 317.632 NaN NaN NaN 772437161.0
187 Africa 1999 830.397 366.523 30.311 23.569 114.377 295.618 NaN NaN NaN 791504165.0
188 Africa 2000 886.562 370.247 31.510 55.282 114.350 315.173 NaN NaN NaN 810984230.0
... ... ... ... ... ... ... ... ... ... ... ... ...
24063 United States 2016 5248.024 1379.744 39.439 51.908 1502.475 2246.524 27.933 629.38 251.7 323015992.0
24064 United States 2017 5207.751 1338.667 40.324 56.186 1480.059 2265.326 27.190 NaN NaN 325084758.0
24065 United States 2018 5375.491 1283.532 38.971 71.008 1641.041 2316.811 24.128 NaN NaN 327096263.0
24066 United States 2019 5255.816 1098.854 40.896 84.510 1694.894 2313.372 23.291 NaN NaN 329064917.0
24067 United States 2020 4712.771 888.649 40.795 84.510 1654.988 2020.538 23.291 NaN NaN 331002647.0

375 rows × 12 columns

final_df.isnull().sum()

country                 0
year                    0
co2                     0
coal_co2               25
cement_co2              0
flaring_co2            77
gas_co2                 0
oil_co2                 0
other_industry_co2    125
methane                81
nitrous_oxide          81
population              0
dtype: int64

3.数据可视化

我们将根据我们的数据集绘制图表并分析一些结果。 我们绘制一下随时间线的co2排放趋势图:

px.line(dataset, x = 'year', y = 'co2', color='country')

在这里插入图片描述

dataset = dataset.dropna(subset=['co2'])

px.scatter(dataset[dataset['year']==2019], x="co2_per_capita", y="energy_per_capita", size="co2", color="country", hover_name="country", log_x=True, size_max=60)

在这里插入图片描述

continent_data =  dataset[(dataset['country'].isin(['Europe', 'Africa', 'North America', 'South America', 'Oceania', 'Asia'])) & (dataset['co2'] > 0)]
continent_data
iso_code country year co2 consumption_co2 co2_growth_prct co2_growth_abs trade_co2 co2_per_capita consumption_co2_per_capita ... ghg_per_capita methane methane_per_capita nitrous_oxide nitrous_oxide_per_capita population gdp primary_energy_consumption energy_per_capita energy_per_gdp
72 NaN Africa 1884 0.022 NaN NaN NaN NaN 0.005 NaN ... NaN NaN NaN NaN NaN 130848603.0 NaN NaN NaN NaN
73 NaN Africa 1885 0.037 NaN 66.67 0.015 NaN 0.008 NaN ... NaN NaN NaN NaN NaN 131563803.0 NaN NaN NaN NaN
74 NaN Africa 1886 0.048 NaN 30.00 0.011 NaN 0.010 NaN ... NaN NaN NaN NaN NaN 132284841.0 NaN NaN NaN NaN
75 NaN Africa 1887 0.048 NaN 0.00 0.000 NaN 0.010 NaN ... NaN NaN NaN NaN NaN 133011765.0 NaN NaN NaN NaN
76 NaN Africa 1888 0.081 NaN 69.23 0.033 NaN 0.017 NaN ... NaN NaN NaN NaN NaN 133744628.0 NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
20888 NaN South America 2016 1164.898 1240.096 -3.32 -40.064 75.198 2.799 2.980 ... NaN NaN NaN NaN NaN 416164871.0 NaN NaN NaN NaN
20889 NaN South America 2017 1156.734 1238.620 -0.70 -8.164 81.886 2.755 2.950 ... NaN NaN NaN NaN NaN 419903920.0 NaN NaN NaN NaN
20890 NaN South America 2018 1091.450 1173.851 -5.64 -65.284 82.401 2.577 2.771 ... NaN NaN NaN NaN NaN 423581098.0 NaN NaN NaN NaN
20891 NaN South America 2019 1065.510 1139.737 -2.38 -25.940 74.228 2.494 2.668 ... NaN NaN NaN NaN NaN 427199425.0 NaN NaN NaN NaN
20892 NaN South America 2020 994.160 NaN -6.70 -71.349 NaN 2.308 NaN ... NaN NaN NaN NaN NaN 430759771.0 NaN NaN NaN NaN

1111 rows × 58 columns

px.pie(final_df, names='country', values='co2')

在这里插入图片描述

final_df_2020 = final_df[(final_df[ 'year' ]==2020) ]
final_df_2020
final_df_2020[['country','coal_co2','cement_co2','flaring_co2','gas_co2', 'oil_co2','other_industry_co2']].plot(x='country', kind='bar',figsize=(9,5),width=0.9)
plt.title('2020 CO2 consumption')
plt.xlabel('Countries' )
plt.ylabel('CO2 measured in million tonnes')

在这里插入图片描述

print(dataset.info)
print(dataset.head())
<bound method DataFrame.info of       iso_code      country  year     co2  consumption_co2  co2_growth_prct  \
0          AFG  Afghanistan  1949   0.015              NaN              NaN   
1          AFG  Afghanistan  1950   0.084              NaN           475.00   
2          AFG  Afghanistan  1951   0.092              NaN             8.70   
3          AFG  Afghanistan  1952   0.092              NaN             0.00   
4          AFG  Afghanistan  1953   0.106              NaN            16.00   
...        ...          ...   ...     ...              ...              ...   
25199      ZWE     Zimbabwe  2016  10.738           12.153           -12.17   
25200      ZWE     Zimbabwe  2017   9.582           11.248           -10.77   
25201      ZWE     Zimbabwe  2018  11.854           13.163            23.72   
25202      ZWE     Zimbabwe  2019  10.949           12.422            -7.64   
25203      ZWE     Zimbabwe  2020  10.531              NaN            -3.82   

       co2_growth_abs  trade_co2  co2_per_capita  consumption_co2_per_capita  \
0                 NaN        NaN           0.002                         NaN   
1               0.070        NaN           0.011                         NaN   
2               0.007        NaN           0.012                         NaN   
3               0.000        NaN           0.012                         NaN   
4               0.015        NaN           0.013                         NaN   
...               ...        ...             ...                         ...   
25199          -1.488      1.415           0.765                       0.866   
25200          -1.156      1.666           0.673                       0.790   
25201           2.273      1.308           0.821                       0.912   
25202          -0.905      1.473           0.748                       0.848   
25203          -0.418        NaN           0.709                         NaN   

       ...  ghg_per_capita  methane  methane_per_capita  nitrous_oxide  \
0      ...             NaN      NaN                 NaN            NaN   
1      ...             NaN      NaN                 NaN            NaN   
2      ...             NaN      NaN                 NaN            NaN   
3      ...             NaN      NaN                 NaN            NaN   
4      ...             NaN      NaN                 NaN            NaN   
...    ...             ...      ...                 ...            ...   
25199  ...           4.703    11.92                0.85           6.55   
25200  ...             NaN      NaN                 NaN            NaN   
25201  ...             NaN      NaN                 NaN            NaN   
25202  ...             NaN      NaN                 NaN            NaN   
25203  ...             NaN      NaN                 NaN            NaN   

       nitrous_oxide_per_capita  population           gdp  \
0                           NaN   7624058.0           NaN   
1                           NaN   7752117.0  9.421400e+09   
2                           NaN   7840151.0  9.692280e+09   
3                           NaN   7935996.0  1.001732e+10   
4                           NaN   8039684.0  1.063052e+10   
...                         ...         ...           ...   
25199                     0.467  14030338.0  2.096179e+10   
25200                       NaN  14236599.0  2.194784e+10   
25201                       NaN  14438812.0  2.271535e+10   
25202                       NaN  14645473.0           NaN   
25203                       NaN  14862927.0           NaN   

       primary_energy_consumption  energy_per_capita  energy_per_gdp  
0                             NaN                NaN             NaN  
1                             NaN                NaN             NaN  
2                             NaN                NaN             NaN  
3                             NaN                NaN             NaN  
4                             NaN                NaN             NaN  
...                           ...                ...             ...  
25199                        47.5           3385.574           1.889  
25200                         NaN                NaN             NaN  
25201                         NaN                NaN             NaN  
25202                         NaN                NaN             NaN  
25203                         NaN                NaN             NaN  

[23949 rows x 58 columns]>
  iso_code      country  year    co2  consumption_co2  co2_growth_prct  \
0      AFG  Afghanistan  1949  0.015              NaN              NaN   
1      AFG  Afghanistan  1950  0.084              NaN            475.0   
2      AFG  Afghanistan  1951  0.092              NaN              8.7   
3      AFG  Afghanistan  1952  0.092              NaN              0.0   
4      AFG  Afghanistan  1953  0.106              NaN             16.0   

   co2_growth_abs  trade_co2  co2_per_capita  consumption_co2_per_capita  ...  \
0             NaN        NaN           0.002                         NaN  ...   
1           0.070        NaN           0.011                         NaN  ...   
2           0.007        NaN           0.012                         NaN  ...   
3           0.000        NaN           0.012                         NaN  ...   
4           0.015        NaN           0.013                         NaN  ...   

   ghg_per_capita  methane  methane_per_capita  nitrous_oxide  \
0             NaN      NaN                 NaN            NaN   
1             NaN      NaN                 NaN            NaN   
2             NaN      NaN                 NaN            NaN   
3             NaN      NaN                 NaN            NaN   
4             NaN      NaN                 NaN            NaN   

   nitrous_oxide_per_capita  population           gdp  \
0                       NaN   7624058.0           NaN   
1                       NaN   7752117.0  9.421400e+09   
2                       NaN   7840151.0  9.692280e+09   
3                       NaN   7935996.0  1.001732e+10   
4                       NaN   8039684.0  1.063052e+10   

   primary_energy_consumption  energy_per_capita  energy_per_gdp  
0                         NaN                NaN             NaN  
1                         NaN                NaN             NaN  
2                         NaN                NaN             NaN  
3                         NaN                NaN             NaN  
4                         NaN                NaN             NaN  

[5 rows x 58 columns]

4. 数据预处理:

在进行数据分析之前,我们需要对数据进行预处理,包括处理缺失值和选择感兴趣的特征列。

features = ['year', 'population', 'gdp', 'primary_energy_consumption', 'energy_per_capita', 'energy_per_gdp']
target = 'co2'
data = dataset[features + [target]].dropna()

5. 机器学习建模:

我们将尝试使用随机森林回归和XGBoost算法建立CO2排放的预测模型,并评估其性能。

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error


# 分割数据集
X = data[features]
y = data[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 随机森林回归
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
y_pred_rf = rf_model.predict(X_test)
mse_rf = mean_squared_error(y_test, y_pred_rf)
print("随机森林回归均方误差:", mse_rf)
随机森林回归均方误差: 5564.344690878827
from xgboost import XGBRegressor

# XGBoost 回归
xgb_model = XGBRegressor(n_estimators=100, random_state=42)
xgb_model.fit(X_train, y_train)
y_pred_xgb = xgb_model.predict(X_test)
mse_xgb = mean_squared_error(y_test, y_pred_xgb)
print("XGBoost 回归均方误差:", mse_xgb)

# 查看测试集的预测结果
results_rf = pd.DataFrame({'Actual': y_test, 'Predicted_RF': y_pred_rf})
results_xgb = pd.DataFrame({'Actual': y_test, 'Predicted_XGB': y_pred_xgb})

print("随机森林回归预测结果:\n", results_rf.head())
print("XGBoost 回归预测结果:\n", results_xgb.head())
XGBoost 回归均方误差: 6550.179319235124
随机森林回归预测结果:
          Actual  Predicted_RF
4678   1183.215    1140.30654
22293     2.536       3.88285
1552    187.609     171.56567
22409     7.440       9.76497
11248   129.475      76.18446
XGBoost 回归预测结果:
          Actual  Predicted_XGB
4678   1183.215    1219.047852
22293     2.536       5.083570
1552    187.609     184.427612
22409     7.440       9.800858
11248   129.475      98.655746

6.结论:

通过对CO2排放数据集的分析和机器学习建模,我们可以更好地理解全球CO2排放的情况,并为未来的环境保护和可持续发展提供数据支持。未来的研究可以进一步探索CO2排放与气候变化、经济增长等因素之间的关系,并提出相应的政策建议。

如有遇到问题可以找小编沟通交流哦。另外小编帮忙辅导大课作业,学生毕设等。不限于MapReduce, MySQL, python,java,大数据,模型训练等。 hadoop hdfs yarn spark Django flask flink kafka flume datax sqoop seatunnel echart可视化 机器学习等
在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐