通过案例初步认识机器学习
一、模型是如何发挥作用
故事背景
你的表亲通过房地产投机赚了数百万美元。他提出要和你成为生意伙伴,因为你在数据科学方面有兴趣。他将提供资金,而你则负责提供预测各类房屋价值的模型。你问表亲过去是如何预测房地产价值的,他说这只是凭直觉。但经过进一步询问,你发现他其实是从过去见过的房屋中总结出了价格模式,并利用这些模式来预测他正在考虑的新房价格。
通过上述故事,我们可以看出机器学习模型的工作原理实际上与你表亲用来预测房地产价值的方法有相似之处。以下是几个关键点的总结:
- 经验积累:就像你的表亲从他见过的房子中总结出价格模式一样,机器学习模型也是基于大量数据进行训练,从中“学习”到特定模式或规律。
- 模式识别:表亲利用他对房屋特征(如位置、面积、房间数量等)和最终售价之间的关系来做出预测。同样地,机器学习模型通过对输入特征(比如房子的各种属性)和目标变量(如售价)之间复杂关系的学习来进行预测。
- 应用学到的知识:一旦你的表亲识别出了这些模式,他就能够对新看到的房子进行估价。类似地,一旦机器学习模型经过充分训练,它就可以应用于新的、未见过的数据,以预测结果。
- 持续改进:随着你的表亲见到更多的房子并积累了更多经验,他的预测能力也可能提高。对于机器学习模型来说,通过不断地用新数据更新模型或调整参数,也可以提升其性能。
二、机器学习模型训练的一般步骤
- 数据处理
# 创建文件路径
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
# 读取文件数据
melbourne_data = pd.read_csv(melbourne_file_path)
# 对数据进行初步的描述
melbourne_data.describe()
- count: 非空数据行数
- mean: 平均值
- std: 标准差
- min: 最小值
- 25%: 25%分位数
- 50%: 50%分位数(中位数)
- 75%:75%分位数
- max: 最大值
- 模型的构建和训练
- 确定目标变量
一般我们把y作为我们的预测目标,y在当前业务场景是房屋的价格。
y = melbourne_data.Price
- 确定训练特征
我们把X作为模型用来学习的特征集合,包含多个变量
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude'] X = melbourne_data[melbourne_features]
- 定义训练模型
#定义模型,这里是决策树模型,同时给予了一个随机状态变量 melbourne_model = DecisionTreeRegressor(random_state=1) # 训练模型这是机器学习的核心 melbourne_model.fit(X, y)
- 确定目标变量
- 模型验证
#通过模型预测房屋价格 predicted_home_prices = melbourne_model.predict(X) #衡量预测值与实际值之间的差异 mean_absolute_error(y, predicted_home_prices)
- 模型调优
过拟合(Overfitting)和欠拟合(Underfitting)是机器学习模型训练过程中常见的两个问题,它们分别描述了模型在处理数据时的两种极端情况。模型调优主要是对模型的超参数进行调整,平衡过拟合和欠拟合的情况,找到最佳的参数,使模型既能很好地适应训练数据又能在未知数据上有良好表现。- 过拟合
当一个模型过于复杂,以至于它不仅学习了训练数据中的基本模式,还学到了其中的噪声和细节,这些额外学到的信息使得模型在训练集上表现得非常好,但在未见过的数据(如验证集或测试集)上的表现却大幅下降。 - 欠拟合
与过拟合相反,欠拟合指的是模型没有能够充分学习到训练数据中的模式,导致无论是在训练集还是新的数据集上表现都不佳。
def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y): model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0) model.fit(train_X, train_y) preds_val = model.predict(val_X) mae = mean_absolute_error(val_y, preds_val) return(mae) # 比较不同超参数【决策树最大节点数】情况下,模型的平均误差大小 for max_leaf_nodes in [5, 50, 500, 5000]: my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y) print("Max leaf nodes: %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
我们可以看到随着最大节点数不断增加,平均误差先减小后增大,在超参数500时,平均误差最小,即最大节点数配置为500为最优参数。 - 过拟合