HW6 note
Question | 内容 |
---|---|
Question 1 | 根据雨云图和describe()得出结论;可视化SalePrice 与Gr_Liv_Area 的关系 |
Question 2a | 添加特征TotalBathrooms |
Question 2b | 可视化TotalBathroom 和SalePrice 的关系 |
Question 3 | 将数据集分成训练集和验证集 |
Question 4a | 创建一个LinearRegression 对象 |
Question 4b | 拟合并预测 |
Question 5a | 定义误差计算函数rmse |
Question 5b | 计算误差rmse |
Question 5c | 说明模型的准确性 |
Question 5d | 如何提高准确性 |
Question 6a | 判断邻居数量与销售价格的关系 |
Question 6b | 用函数筛选富人社区 |
Question 6c | 添加一个指示变量区分出富裕社区。 |
Question 7a | 判断数据集是否有缺失值 |
Question 7b | 替换缺失值与缩写词 |
Question 8a | 熟悉交叉验证的流程 |
Question 8b | 使用cross_validate_rmse 评估模型 |
Question 9 | 改进模型 |
介绍
在这个作业中,我们将经历一个模型的识别、拟合和分析性能的迭代过程。
在作业的第一部分,我们将指导你完成一些基本的探索性数据分析(EDA),布局导致某些建模决策的思维过程。接下来,我们将向数据集中添加一个新特征,然后对住房数据的一些特征指定一个线性模型,并拟合一个线性模型来预测房价。最后,我们将对模型的误差进行分析,并讨论提高模型性能的方法。
完成这项作业后,你应该能熟练掌握以下内容:
-
简单特征工程
-
使用sklearn来构建简单和复杂的线性模型
-
使用pandas构建数据管道
-
利用EDA识别信息变量
-
基于分类变量的特征工程
Part 1: Exploratory Data Analysis
在本节中,我们将制作一系列探索性可视化并解释它们。
请注意,我们将对训练数据执行EDA,以便测试数据中的信息不会影响我们的建模决策。
Sale Price
绘制雨云图,观察数据:
同时结合describe()
函数进一步了解数据。
Question 1
根据数据得出一些结论:
-
训练集中' salesprice '的分布是左偏的。
-
训练集中' salesprice '的均值小于中位数。
-
训练集中至少有25%的房子以超过200,000.00美元的价格出售。
SalePrice vs Gr_Liv_Area
将salesprice
和Gr_Liv_Area
之间的关联可视化。
结论:它们之间肯定存在某种关联,而且可能是线性的,但当两个变量的值都较大时,分布范围更大。此外,还有两幢面积超过5000平方英尺的房子特别可疑,就其面积而言,它们看起来太便宜了。
接着,我们可以找到“Gr_Liv_Area”大于5000平方英尺的两个房子的地块识别号。
根据数据,我们可以得出这些数据是不合理的,于是定义一个函数,remove_outliers
,将它们删除。
Part 2: Feature Engineering
在本节中,我们将通过简单的数据转换从现有特征中创建一个新特征。
Bathrooms
根据相关资料,从已知信息中推出额外信息:
由于通用厕所计数理论的最新进展,我们现在知道总厕所可以计算为:
Question 2a
使用函数,add_total_bathrooms(data)
,添加新列,TotalBathrooms
Question 2b
可视化TotalBathroom
和SalePrice
的关系
Part 3: Modeling
Question 3
将数据集分成训练集和验证集。我们将使用训练集来拟合模型的参数,使用验证集来估计模型在相同分布下未见过的数据上的表现。
具体来说:使用sklearn.model_selection
中的train_test_split
函数,将full_data
中的数据分割为两个dataframe,分别名为train
和val
。让train
包含80%的数据,让val
包含剩余的20%的数据。
Reusable Pipeline
在整个赋值过程中,你应该注意到数据在同一个处理流水线中多次流动。从软件工程的角度来看,最好定义可以将管道应用于任何数据集的函数/方法。我们现在将整个管道封装为一个函数process_data_gm
。Gm是“引导模式”(guided model)的缩写。我们从众多可用特征中选择少量特征使用。
现在,我们可以使用process_data_gm
来清理我们的数据,选择功能,并添加我们的 TotalBathrooms
特征,所有这些都在一步之内!该函数还将我们的数据分为特征矩阵X
和销售价格向量y
。
Fitting Our First Model
Question 4a
使用sklearn.linear_model.LinearRegression
对象作为我们的线性模型。
创建一个LinearRegression
对象并将其命名为linear_model
。
Question 4b
拟合并预测
Question 5a
通过计算预测房价与存储在salesprice
中的真实价格之间的均方根误差(RMSE)来衡量模型的质量。
编写一个名为rmse
的函数,用于计算模型的rmse。
提示:确保你的代码向量化。
Question 5b
使用rmse
函数计算模型训练集和预测集的rmse
Question 5c
包含“total浴室”作为预测变量会在多大程度上降低模型在验证集上的RMSE?也就是说,只包含“Gr_Liv_Area”和“Garage_Area”的模型的RSME与包含所有三个预测变量的模型的RSME有什么区别?
在一些论文中好像看到了类似的做法,通过减少特证数导致的误差上升来说明模型的准确性。
Residual Plots
理解模型性能(和适用性)的一种方法是残差图。用残差图将实际销售价格与验证数据的模型残差绘制在一起。
理想情况下,我们将在0处看到一条水平线(完美的预测!)。下一个最佳选择是一个以0为中心的齐次点集合。
Question 5d
你可以对你的线性模型做什么改变来提高它的准确性和降低验证误差?在下面的单元格中建议至少两件你可以尝试的事情,并仔细解释每一项改变如何潜在地提高你的模型的准确性。
正则化(Regularization):正则化是一种用于防止线性模型过拟合的方法。过拟合是指模型与训练数据拟合过于紧密,导致在训练集上具有较高的精度,但在验证集上的精度较低。两种常见的正则化类型是L1正则化和L2正则化,分别称为Lasso和Ridge正则化。通过在损失函数中添加正则化项,可以使模型具有更小的系数,从而减少过拟合并提高模型的泛化能力。
特征工程:特征工程是创建新特征或改造现有特征以提高机器学习模型性能的过程。这可以通过组合现有特征、创建多项式特征或使用特定领域的知识来创建新特征来实现。通过创建信息更丰富的特征,模型能够更好地捕捉数据中的底层关系,并做出更准确的预测,从而减少验证误差。
Part 4: More Feature Selection and Engineering
在本节中,我们将确定数据集的另外两个特征,它们将提高线性回归模型的精度。此外,我们将实现one-hot encoding,以便我们可以在改进的模型中包含二进制和分类变量。
我们使用了一个稍微修改过的数据清理管道来准备训练数据。该数据存储在ames_train_cleaned.csv
中。它由1998年的观察和83个特征组成(我们从作业的前半部分添加了“TotalBathrooms”特征)。
Question 6: Neighborhood vs Sale Price
看看数据集中的社区和房屋销售价格之间的关系。
Question 6a
根据上面的图,房子的销售价格和他们的社区之间有什么关系?
我感觉没什么关系?
Question 6b
处理某些邻域缺乏数据的一种方法是创建一个新特征,将邻域划分到一起。让我们以粗略的方式对社区进行分类:我们将采用中位数“销售价格”衡量的前3个社区,并将它们确定为“富裕社区”。我们不标记其他街区。
编写一个函数,根据选择的聚合函数,返回前n个最昂贵的邻域列表。例如,在上面的设置中,我们希望调用 find_rich_neighbours (training_data_cleaned, 3, np.median)
来找到以中位数salesprice
衡量的前3个邻域。
用0,1区分富裕社区。
Question 6c
我们现在有一个列表,列出了我们认为比其他社区富裕的社区。让我们使用这些信息来创建一个新变量in_rich_neighborhood
。编写一个函数add_rich_neighborhood
,它添加一个指示变量,如果房子属于“富人社区”,指示器变量的值为1,否则为0。
提示: pd.Series.astype
在将True/False值转换为整数时可能很有用。
Question 7: Fireplace Quality
在下面的问题中,我们将仔细研究数据集的Fireplace_Qu特征,并检查我们如何将分类特征合并到线性模型中。
Question 7a
创建一个Series对象,看看数据集是否有缺失值。
Question 7b
这里的“NA”实际上意味着这所房子没有壁炉。让我们在数据集中解决这个问题。写一个函数来替换Fireplace_Qu
中缺失的值为No Fireplace
。此外,它应该将每个缩略条件替换为其完整的单词。例如,“TA”应该改为“Average”。
提示:DataFrame.replace方法在这里可能有用。
An Important Note on One Hot Encoding
使用DictVectorizer
进行one-hot编码
Part 5: Improved Linear Models
在本节中,我们将创建线性模型,该模型对Ames房价的估计比上一节中创建的模型更精确,但代价是增加了复杂性。
Question 8: Adding Covariates to our Model
Question 8a
使用交叉验证来帮助验证我们的模型,而不是显式地将数据分为训练集和验证集。
- 重新导入数据
- 实现数据处理的pipeline,对数据进行处理,并分离X, y
- 初始化回归模型
- 拟合
- 预测
- 用
rmse
评估模型
Question 8b
使用cross_validate_rmse
评估模型
用交叉验证的结果好像更差一点(○´・д・)ノ
Part 6: Open-Response
下面的部分有意保持几乎开放式。您所拥有的Ames数据来自一个更大的数据集。你的目标是提供一个线性回归模型,用均方根误差(root mean square error)来精确预测持有房屋的价格。
我做了如下工作:
用类似处理TotalBathrooms的方法引入Overall_Qual(改变最明显)
用类似处理Fireplace_Qu的方法处理MS_Zoning
用类似处理in_rich_neighborhood的方法处理Heating_QC
最终模型准确率为
training_rmse_fm, test_rmse_fm =
(34376.91466607031, 34245.896126621235)