目录
一、项目概述
在机器学习领域,决策树是一种常用的分类与回归方法。它通过对数据特征进行划分,构建树形结构来进行决策。本项目旨在利用决策树算法,根据天气条件(如 Outlook、Temperature 等)预测是否适合进行户外活动(Play)。通过对天气数据集的分析和建模,我们可以了解决策树的工作原理以及如何应用它解决实际问题。
二、数据处理与分析
1. 数据读取与基本情况
首先,我们使用 pandas 库读取存储在 CSV 文件中的天气数据。
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
# 读取csv数据
data = pd.read_csv('项目\machine_learning\机器学习实战03-利用决策树预测天气数据集类型\weather.csv')
这个数据集包含了天气的几个特征:Outlook(天气状况)、Temperature(温度)、Humidity(湿度)、Windy(是否有风),以及对应的结果 Play(是否适合户外活动)。
2. 数据预处理
由于机器学习模型通常只能处理数值型数据,我们需要对原始数据进行编码转换。
(1)标签编码(Label Encoding)
对于像 Outlook、Temperature、Humidity、Windy 这些分类特征,我们使用 LabelEncoder 将它们转换为数值。
# 将字符串编码为数字
label_encoder = LabelEncoder()
data['Outlook'] = label_encoder.fit_transform(data['Outlook'])
data['Temperature'] = label_encoder.fit_transform(data['Temperature'])
data['Humidity'] = label_encoder.fit_transform(data['Humidity'])
data['Windy'] = label_encoder.fit_transform(data['Windy'])
例如,Outlook 中的 'Sunny'、'Overcast'、'Rainy' 可能被编码为 0、1、2 等数值。
(2)独热编码(One-Hot Encoding)
对于某些分类特征,标签编码可能会引入不必要的顺序关系,因此我们对 Outlook 和 Temperature 进行独热编码。
# 将数字特征进行独热编码
one_hot_encoder = OneHotEncoder(categories='auto')
encoded_features = one_hot_encoder.fit_transform(data[['Outlook', 'Temperature']]).toarray()
独热编码会将每个分类值转换为一个二进制向量,避免了顺序关系的问题。
(3)结果标签转换
将 Play 列中的 'Yes' 和 'No' 映射为 1 和 0。
# 将Play列映射为二进制类别变量
data['Play'] = data['Play'].map({'Yes': 1, 'No': 0})
3. 特征与标签准备
将编码后的特征和原始的 Windy、Humidity 特征合并作为输入特征 X,Play 列作为目标标签 y。
# 将编码后的特征和标签分割
X = pd.concat([pd.DataFrame(encoded_features), data[['Windy', 'Humidity']]], axis=1)
y = data['Play']
# 将特征名称转换为字符串
X.columns = X.columns.astype(str)
三、决策树模型构建与训练
1. 模型创建与训练
使用 scikit-learn 中的 DecisionTreeClassifier 创建决策树模型,并使用准备好的数据进行训练。
# 建立决策树模型并进行拟合
model = DecisionTreeClassifier()
model.fit(X, y)
2. 模型预测
使用训练好的模型对新数据进行预测。例如,对于天气条件 [Sunny,Hot,High,Weak],我们先将其编码为模型可以接受的格式,然后进行预测。
# 预测新数据
# 【Sunny,Hot,High,Weak】编码为[0, 0, 1, 0, 1, 0, 1, 0]
new_data = pd.DataFrame([[0, 0, 1, 0, 1, 0, 1, 0]], columns=X.columns)
prediction = model.predict(new_data)
if prediction == 1:
print('Play: No')
else:
print('Play: Yes')
四、决策树可视化
为了更直观地理解决策树的决策过程,我们使用 plot_tree 函数将决策树可视化。
# 画出决策树
plt.figure(figsize=(8, 8))
plot_tree(model, filled=True, feature_names=X.columns, class_names=['Not Play', 'Play'])
plt.show()
决策树可视化后,每个内部节点表示一个特征上的测试,每个分支表示测试输出,每个叶节点表示一个类别。通过观察决策树,我们可以清晰地看到模型是如何根据不同的天气特征来决定是否适合进行户外活动的。
五、项目总结
本项目展示了如何使用决策树算法处理分类问题。通过对天气数据集的预处理、特征工程、模型训练和可视化,我们完成了一个完整的机器学习流程。决策树的优点是易于理解和解释,能够直观地展示决策过程,适合处理小规模数据集。
在实际应用中,我们可以根据决策树的结果,更好地规划户外活动。例如,如果天气是晴天且温度高,根据我们的模型预测,可能就不适合进行户外活动。此外,这个项目也展示了数据预处理和特征工程在机器学习中的重要性,正确的编码方式和特征选择能够显著提升模型的性能。
通过这个项目,我们不仅学会了如何使用决策树算法解决分类问题,还了解了如何对分类特征进行编码,以及如何可视化决策树模型,这些都是机器学习领域的基础技能。
六、完整的代码和数据集
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
# 读取csv数据
data = pd.read_csv('weather.csv')
# 将字符串编码为数字
label_encoder = LabelEncoder()
data['Outlook'] = label_encoder.fit_transform(data['Outlook'])
data['Temperature'] = label_encoder.fit_transform(data['Temperature'])
data['Humidity'] = label_encoder.fit_transform(data['Humidity'])
data['Windy'] = label_encoder.fit_transform(data['Windy'])
# 将数字特征进行独热编码
one_hot_encoder = OneHotEncoder(categories='auto')
encoded_features = one_hot_encoder.fit_transform(data[['Outlook', 'Temperature']]).toarray()
# 将Play列映射为二进制类别变量
data['Play'] = data['Play'].map({'Yes': 1, 'No': 0})
# 将编码后的特征和标签分割
X = pd.concat([pd.DataFrame(encoded_features), data[['Windy', 'Humidity']]], axis=1)
y = data['Play']
# 将特征名称转换为字符串
X.columns = X.columns.astype(str)
# 建立决策树模型并进行拟合
model = DecisionTreeClassifier()
model.fit(X, y)
# 预测新数据
# 【Sunny,Hot,High,Weak】编码为[0, 0, 1, 0, 1, 0, 1, 0]
new_data = pd.DataFrame([[0, 0, 1, 0, 1, 0, 1, 0]], columns=X.columns)
prediction = model.predict(new_data)
if prediction == 1:
print('Play: No')
else:
print('Play: Yes')
# 画出决策树
plt.figure(figsize=(8, 8))
plot_tree(model, filled=True, feature_names=X.columns, class_names=['Not Play', 'Play'])
plt.show()
数据集 (weather.csv):
Outlook,Temperature,Humidity,Windy,Play
Sunny,Hot,High,Weak,No
Sunny,Hot,High,Strong,No
Overcast,Hot,High,Weak,Yes
Rainy,Mild,High,Weak,Yes
Rainy,Cool,Normal,Weak,Yes
Rainy,Cool,Normal,Strong,No
Overcast,Cool,Normal,Strong,Yes
Sunny,Mild,High,Weak,No
Sunny,Cool,Normal,Weak,Yes
Rainy,Mild,Normal,Weak,Yes
Sunny,Mild,Normal,Strong,Yes
Overcast,Mild,High,Strong,Yes
Overcast,Hot,Normal,Weak,Yes
Rainy,Mild,High,Strong,No
你可以直接使用这些代码和数据进行实验。如果需要调整模型或添加新的特征,可以在此基础上进行修改。