基于機器學習預測未來的二氧化碳排放量(隨機森林和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可視化 機器學習等