python-机器学习-预测房价问题 House Price Advanced Regression Techniques

本文介绍了使用Python进行房价预测的机器学习项目,涵盖需求分析、开发环境、相关理论及实现步骤。通过数据清洗、特征工程和高级回归技术,如Lasso回归,建立预测模型。PyCharm作为开发环境,用于数据处理和模型训练。项目最终通过均方根误差(RMSE)评估预测效果。
摘要由CSDN通过智能技术生成

         预测房价问题 House Price Advanced Regression Techniques

1.绪论

1.1需求分析

购房者描述他们的梦想房屋,他们可能不会从地下室天花板的高度或靠近东西方铁路开始。但是这个游乐场比赛的数据集证明了价格谈判比卧室或白色栅栏的数量更多。同时项目给出维79特征向量用来描述(几乎)爱荷华州Ames住宅的每一个方面。有79个解释变量描述(几乎)爱荷华州埃姆斯的住宅的各个方面,这次竞赛挑战需要预测每个家庭的最终价格。预测每栋房屋的销售价格是此次的职责。对于测试集中的每个Id,必须预测SalePrice变量的值,在预测值的对数与观察到的销售价格的对数之间的均方根误差(RMSE)上评估提交,记录日志意味着预测昂贵房屋和廉价房屋的错误将同样影响结果。 

1.2开发环境

PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

PyCharm是由JetBrains打造的一款Python IDE,VS2010的重构插件Resharper就是出自JetBrains之手。同时支持Google App Engine,PyCharm支持IronPython。这些功能在先进代码分析程序的支持下,使 PyCharm 成为 Python 专业开发人员和刚起步人员使用的有力工具。

PyCharm拥有一般IDE具备的功能,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制,另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython

1.3相关理论

数据清洗:

数据清洗从名字上也看的出就是把“脏”的“洗掉”,指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。因为数据仓库中的数据是面向某一主题的数据的集合,这些数据从多个业务系统中抽取而来而且包含历史数据,这样就避免不了有的数据是错误数据、有的数据相互之间有冲突,这些错误的或有冲突的数据显然是我们不想要的,称为“脏数据”。我们要按照一定的规则把“脏数据”“洗掉”,这就是数据清洗。而数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。数据清洗是与问卷审核不同,录入后的数据清理一般是由计算机而不是人工完成  

特征工程:

数据和特征决定了机器学习的上限,而模型和算法则是逼近这个上限。因此,特征工程就变得尤为重要了。特征工程的主要工作就是对特征的处理,包括数据的采集,数据预处理,特征选择,甚至降维技术等跟特征有关的工作。

建模:

建模就是建立模型,就是为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述。建立系统模型的过程,又称模型化。建模是研究系统的重要手段和前提。凡是用模型描述系统的因果关系或相互关系的过程都属于建模。因描述的关系各异,所以实现这一过程的手段和方法也是多种多样的。可以通过对系统本身运动规律的分析,根据事物的机理来建模;也可以通过对系统的实验或统计数据的处理,并根据关于系统的已有的知识和经验来建模。还可以同时使用几种方法。

高级回归技术:

回归分析是研究自变量和因变量之间关系的一种预测模型技术。这些技术应用于预测,时间序列模型和找到变量之间关系。例如可以通过回归去研究超速与交通事故发生次数的关系。这里有一些使用回归分析的好处:它指示出自变量与因变量之间的显著关系;它指示出多个自变量对因变量的影响。回归分析允许我们比较不同尺度的变量,例如:价格改变的影响和宣传活动的次数。这些好处可以帮助市场研究者/数据分析师去除和评价用于建立预测模型里面的变量

2.设计与实现

2.1概要设计

数据导入→操作数据→模型训练→分析预测房价

2.2详细设计与实现

     图2.2-1系统总体流程图

导入并将测试集和测试数据集放入pandas dataframe

train.drop("Id", axis=1, inplace=True)
test.drop("Id", axis=1, inplace=True)

修改异常值

fig, ax = plt.subplots()
ax.scatter(x=train['GrLivArea'], y=train['SalePrice'])
plt.ylabel('SalePrice', fontsize=13)
plt.xlabel('GrLivArea', fontsize=13)
plt.show()

检查样本数量和特征

print("The train data size before dropping Id feature is : {} ".format(train.shape))
print("The test data size before dropping Id feature is : {} ".format(test.shape))

保存“id”列

train_ID = train['Id']
test_ID = test['Id']

现在去掉“id”列,因为它对于预测过程是不必要的

train.drop("Id", axis=1, inplace=True)
test.drop("Id", axis=1, inplace=True)

删除“id”变量后再次检查数据大小

print("\nThe train data size after dropping Id feature is : {} ".format(train.shape))
print("The test data size after dropping Id feature is : {} ".format(test.shape))

数据中对于Ames住房数据,表明培训数据中存在异常值,我们来研究一下这些异常值

fig, ax = plt.subplots()
ax.scatter(x=train['GrLivArea'], y=train['SalePrice'])
plt.ylabel('SalePrice', fontsize=13)
plt.xlabel('GrLivArea', fontsize=13)
plt.show()

可以在右下角看到两个地皮非常大的地皮,价格很低。这些价值观是巨大的bug,可以安全地删除它们

train = train.drop(train[(train['GrLivArea']>4000) & (train['SalePrice']<300000)].index)

#Check the graphic again
fig, ax = plt.subplots()
ax.scatter(train['GrLivArea'], train['SalePrice'])
plt.ylabel('SalePrice', fontsize=13)
plt.xlabel('GrLivArea', fontsize=13)
plt.show()

销售价格是需要预测的变量,先来分析一下这个变量

sns.distplot(train['SalePrice'], fit=norm)
(mu, sigma) = norm.fit(train['SalePrice'])
print('\n mu = {:.2f} and sigma = {:.2f}\n'.format(mu, sigma))

plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.2f} )'.format(mu, sigma)], loc='best')
plt.ylabel('Frequency')
plt.title('SalePrice distribution')

# Get also the QQ-plot
fig = plt.figure()
res = stats.probplot(train['SalePrice'], plot=plt)
plt.show()

目标变量是右倾斜的。由于(线性)模型喜欢正态分布的数据,我们需要转换这个变量,使其更为正态分布,目标变量的对数转换

sns.distplot(train['SalePrice'] , fit=norm);

(mu, sigma) = norm.fit(train['SalePrice'])
print( '\n mu = {:.2f} and sigma = {:.2f}\n'.format(mu, sigma))

plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.2f} )'.format(mu, sigma)],
            loc='best')
plt.ylabel('Frequency')
plt.title('SalePrice distribution')

#Get also the QQ-plot
fig = plt.figure()
res = stats.probplot(train['SalePrice'], plot=plt)
plt.show()

将训练数据和测试数据合并,一起进行特征工程

ntrain = train.shape[0]
ntest = test.shape[0]
y_train = train.SalePrice.values
all_data = pd.concat((train, test)).reset_index(drop=True)
all_data.drop(['SalePrice'], axis=1, inplace=True)
print("all_data size is : {}".format(all_data.shape))

分析数据确实情况:缺失数据可视化

all_data_na = (all_data.isnull().sum() / len(all_data)) * 100
all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)[:30]
missing_data = pd.DataFrame({'Missing Ratio' :all_data_na})
missing_data.head(20)

f, ax = plt.subplots(figsize=(15, 12))
plt.xticks(rotation='90')
sns.barplot(x=all_data_na.index, y=all_data_na)
plt.xlabel('Features', fontsize=15)
plt.ylabel('Percent of missing values', fontsize=15)
plt.title('Percent missing data by feature', 
  • 15
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值