沧海拾珠

机器学习之决策树预测天气

1. 决策树简介

决策树是一个预测模型;它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。
从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树。

2. 导入相关的库

1
2
3
4
import pandas as pd
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

3. 创建数据集。

数据来源是2014美国死亡谷的天气数据(death_valley_2014.csv)。

1
2
3
4
5
6
7
8
9
10
11
df = pd.read_csv("death_valley_2014.csv")
df.columns
Index(['PST', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF',
'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity',
' Mean Humidity', ' Min Humidity', ' Max Sea Level PressureIn',
' Mean Sea Level PressureIn', ' Min Sea Level PressureIn',
' Max VisibilityMiles', ' Mean VisibilityMiles', ' Min VisibilityMiles',
' Max Wind SpeedMPH', ' Mean Wind SpeedMPH', ' Max Gust SpeedMPH',
'PrecipitationIn', ' CloudCover', ' Events', ' WindDirDegrees'],
dtype='object')

4. 数据筛选。

上面数据参数比较多,需要进行必要的筛选,只留下认为能预测天气的几个因素。

1
2
3
4
5
6
7
8
9
10
11
12
new_df = df[['Mean TemperatureF','MeanDew PointF',' Mean Humidity',' Mean Wind SpeedMPH',' CloudCover',' Events']].copy()
from tabulate import tabulate
print(tabulate(new_df.head(), tablefmt="markdown", headers="keys"))
Mean TemperatureF MeanDew PointF Mean Humidity Mean Wind SpeedMPH CloudCover Events
-- ------------------- ---------------- ---------------- --------------------- ------------- ---------
0 42 9 32 2 0 nan
1 47 19 36 2 0 nan
2 46 21 40 3 0 nan
3 47 21 42 4 0 nan
4 44 7 30 4 0 nan

5. 处理nan值。

先对”Events”数据这一列进行填充,把nan值变为0。

1
new_df[' Events'].fillna(0,inplace = True)

查看数据集中是否还有其他nan值。

1
2
3
4
5
6
7
8
9
10
DF = new_df[new_df.isnull().any(axis=1)]
print(tabulate(DF.head(), tablefmt="markdown", headers="keys"))
Mean TemperatureF MeanDew PointF Mean Humidity Mean Wind SpeedMPH CloudCover Events
--- ------------------- ---------------- ---------------- --------------------- ------------- ---------
46 nan nan nan nan nan 0
107 70 41 38 7 nan 0
108 72 38 32 6 nan 0
113 64 36 35 18 nan 0
114 58 25 29 16 nan 0

由上表可知,第46列是空列,需要删除,其次”CloudCover”也有nan值,需要转化为数值0。此外还需把”Events” 这一列中的string转化为number。

1
2
3
new_df = new_df.drop([46])
new_df[' CloudCover'].fillna(0,inplace = True)
new_df[' Events'].replace({'Rain':1,'Rain-Thunderstorm':1,'Fog':2},inplace = True)

6. 数据分组。

提取出特征值及响应值,开始进行数据分组。使用一半的数据训练,一半的数据测试。

1
2
3
4
features = ['Mean TemperatureF','MeanDew PointF',' Mean Humidity',' Mean Wind SpeedMPH',' CloudCover']
X = new_df[features].copy()
Y = new_df[' Events'].copy()
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.5, random_state=324)

7. 进行训练。

初始化决策树分类器,然后进行训练。

1
2
rain_predict = DecisionTreeClassifier(max_leaf_nodes= 10, random_state = 0)
rain_predict.fit(X_train, y_train)

8. 预测。

使用模型进行预测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
predictions = rain_predict.predict(X_test)
predictions[:10]
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int64)
y_test[:10]
284 0
42 0
121 0
20 0
96 0
210 0
86 0
294 0
117 0
357 0

9. 计算准确率。

1
2
accuracy_score(y_true = y_test, y_pred = predictions)
0.9555555555555556