♂️ 个人主页:@艾派森的个人主页
✍作者简介:Python学习者
希望大家多多支持,我们一起进步!
如果文章对你有帮助的话,
欢迎评论 点赞 收藏 加关注+
喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章
大数据分析案例-基于随机森林算法预测人类预期寿命 |
大数据分析案例-基于随机森林算法的商品评价情感分析 |
大数据分析案例-用RFM模型对客户价值分析(聚类) |
大数据分析案例-对电信客户流失分析预警预测 |
大数据分析案例-基于随机森林模型对北京房价进行预测 |
大数据分析案例-基于RFM模型对电商客户价值分析 |
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型 |
大数据分析案例-基于决策树算法构建员工离职预测模型 |
大数据分析案例-基于KNN算法对茅台股票进行预测 |
大数据分析案例-基于多元线性回归算法构建广告投放收益模型 |
大数据分析案例-基于随机森林算法构建返乡人群预测模型 |
大数据分析案例-基于决策树算法构建金融反欺诈分类模型 |
目录
1.项目背景
2.项目简介
2.1项目说明
2.2数据说明
2.3技术工具
3.算法原理
4.项目实施步骤
4.1理解数据
4.2数据预处理
4.3探索性数据分析
4.4特征工程
4.5模型构建
4.6模型评估
5.实验总结
源代码
随着经济的发展和城市化进程的加速,房地产市场日益繁荣,房屋价格的波动不仅关系到千家万户的财产安全,也对整个社会经济稳定产生重要影响。因此,准确预测房屋价格的变化趋势,对于政府制定房地产政策、投资者决策以及消费者购房计划都具有重要的参考价值。
近年来,机器学习技术取得了长足的发展,为房屋价格预测提供了新的解决思路。基于机器学习算法的房屋价格预测模型,能够通过学习历史数据中的潜在规律,实现对未来房屋价格的预测。在众多机器学习算法中,LinearRegression(线性回归)是一种基础且广泛应用的算法,它通过建立自变量与因变量之间的线性关系,实现对因变量的预测。
研究背景:
研究意义:
基于LinearRegression回归算法构建房屋价格预测模型,不仅有助于提高房屋价格预测的准确性和时效性,还可以为政府、企业和个人提供更加科学、合理的决策依据。具体来说,该研究的意义体现在以下几个方面:
本实验旨在通过使用线性回归算法,基于历史房屋销售数据,构建一个房屋价格预测模型。通过分析房屋价格与各种特征之间的线性关系,我们可以更好地理解这些影响因素对房屋价格的影响程度,并为未来的房地产市场提供更准确的价格预测。通过这个实验,我们可以深入了解线性回归在房地产领域的应用,为相关领域的从业人员和决策者提供有益的参考。此外,我们还将评估模型的性能,并讨论可能的改进和进一步研究方向。这将有助于推动机器学习在房地产领域的应用和发展。
本数据集来源于Kaggle,原始数据共有50000条,6列,各变量含义解释如下:
SquareFeet:房子的平方英尺。
Bedrooms:卧室的数量。
Bathrooms:卫生间的数量。
Neighborhood:房子所在的区域。
YearBuilt:哪一年建造的。
Price:房屋的价格。
Python版本:3.9
代码编辑器:jupyter notebook
线性回归是一个主要影响因素作为自变量来解释因变量的变化,在现实问题研究中,因变量的变化往往受几个重要因素的影响,此时就需要用两个或两个以上的影响因素作为自变量来解释因变量的变化,这就是多元回归亦称多重回归。当多个自变量与因变量之间是线性关系时,所进行的回归分析就是多元线性回归。 设y为因变量X1,X2…Xk为自变量,并且自变量与因变量之间为线性关系时,则多元线性回归模型为:
Y=b0+b1x1+…+bkxk+e
其中,b0为常数项,b1,b2…bk为回归系数,b1为X1,X2…Xk固定时,x1每增加一个单位对y的效应,即x1对y的偏回归系数;同理b2为X1,X2…Xk固定时,x2每增加一个单位对y的效应,即,x2对y的偏回归系数,等等。如果两个自变量x1,x2同一个因变量y呈线相关时,可用二元线性回归模型描述为:
y=b0 +b1x1 +b2x2 +e
建立多元线性回归模型时,为了保证回归模型具有优良的解释能力和预测效果,应首先注意自变量的选择,其准则是:
(1)自变量对因变量必须有显著的影响,并呈密切的线性相关;
(2)自变量与因变量之间的线性相关必须是真实的,而不是形式上的;
(3)自变量之间应具有一定的互斥性,即自变量之间的相关程度不应高于自变量与因变量之间的相关程度;
(4)自变量应具有完整的统计数据,其预测值容易确定。
首先导入常用的第三方库并加载数据
查看数据大小
查看数据基本信息
查看描述性统计
从结果中我们看到价格列中最小值为负值,存在异常值,后面需要处理
查看缺失值情况
发现没有缺失值不需要处理
查看重复值情况
发现结果为False,说明不存在重复值,不需要处理
查看异常数据
剔除异常数据
我们可以看到平方英尺面积和价格之间呈正相关关系。
农村、郊区和城市数据的价格分布是相等的。
上图遵循高斯分布 中位数价格为225052.14
农村、郊区和城市数据比例几乎是一样的。
我们可以看到,邻域和建造年份没有太大的关系
准备建模的数据,并拆分数据集为训练集和测试集
数据标准化处理
初始化模型
自定义一个评估模型的函数
构建模型
可以发现线性回归模型的准确率是最高的
本实验通过应用线性回归算法构建了一个房屋价格预测模型,旨在通过各种特征变量对房屋价格进行建模和预测。以下是实验的主要总结点:
数据收集和预处理: 首先,我们收集了包含房屋价格和各种特征的数据集,确保数据的完整性和质量。在数据预处理阶段,进行了清洗、缺失值处理和特征选择,以确保输入数据的质量。
模型构建: 采用线性回归算法建立了房屋价格预测模型。该模型基于线性关系,通过训练数据拟合出最佳的权重系数,以最小化预测值与实际值之间的差异。
模型评估: 使用评价指标如均方误差(MSE)、R^2分数等对模型进行了评估。评估结果对模型的准确性和泛化能力进行了全面的分析,以确保模型能够在新数据上进行可靠的预测。
应用前景: 通过构建房屋价格预测模型,我们为房地产市场相关的决策提供了一个有力的工具。该模型不仅可以帮助买家和卖家更好地了解市场趋势,还可以为投资者和开发商提供决策支持,优化房地产资产的配置。
局限性和未来工作: 实验中可能存在一些局限性,比如模型对非线性关系的适应性较差。未来的工作可以探索更复杂的模型,考虑更多特征或采用其他机器学习算法,以提高预测性能。
综合而言,通过本实验,我们成功构建了一个基于线性回归的房屋价格预测模型,并为房地产市场相关的决策提供了有益的信息。模型的建立和评估过程为未来类似问题的研究提供了有力的参考和指导。
心得与体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。
SquareFeet:房子的平方英尺。
Bedrooms:卧室的数量。
Bathrooms:卫生间的数量。
Neighborhood:房子所在的区域。
YearBuilt:哪一年建造的。
Price:房屋的价格。
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('housing_price_dataset.csv')
df.head()
df.shape
df.info()
df.describe()
df.isnull().sum() # 统计缺失数据
any(df.duplicated()) # 检验是否存在重复数据
df[df['Price']<=0] # 异常数据
df = df[df['Price']>=0] # 剔除价格为负数的异常数据
df.shape
# 房屋大小与价格的关系
sns.scatterplot(data=df, x='SquareFeet',y='Price')
plt.show()
我们可以看到平方英尺面积和价格之间呈正相关关系。
# 不同区域的房屋价格关系
sns.scatterplot(data=df, x='SquareFeet',y='Price',hue='Neighborhood')
plt.show()
# 不同区域的房屋价格情况
sns.barplot(data=df, x='Neighborhood',y='Price',hue='Neighborhood')
plt.legend(loc=10)
plt.show()
农村、郊区和城市数据的价格分布是相等的。
# 价格分布情况
sns.histplot(data=df,x='Price');
median = np.median(df['Price'])
print(f'{median:.2f} is the Median Price.')
plt.show()
上图遵循高斯分布
中位数价格为225052.14
# 不同区域的比例情况
plt.pie(df["Neighborhood"].value_counts(), labels=df["Neighborhood"].value_counts().index, autopct='%1.1f%%', startangle=90)
plt.title('Distribution of Neighborhoods')
plt.show()
农村、郊区和城市数据比例几乎是一样的。
# 相关系数分析
neighbourhood_codes = {'Rural':0,'Suburb':1,'Urbun':2} # 编码处理
mapping = df['Neighborhood'].map(neighbourhood_codes)
df['Price'].corr(mapping)
plt.figure(figsize=(8,6))
sns.heatmap(df[df.select_dtypes(include=np.number).columns.to_list()].corr(), annot=True);
我们可以看到,邻域和建造年份没有太大的关系
# 准备建模数据
X = df.drop(columns = ["Price", "Neighborhood", "YearBuilt"], axis = 1)
y = df["Price"]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)
print(X_train.shape[0])
print(X_test.shape[0])
# 数据标准化处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 初始化模型
from sklearn.linear_model import LinearRegression, ElasticNet
from sklearn.svm import SVR
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor
from sklearn.neighbors import KNeighborsRegressor
import xgboost as xb
models = {
"Linear Regreesion": LinearRegression(),
"ElasticNet": ElasticNet(),
"Support Vector Regressor": SVR(),
"Decison Tree Regressor": DecisionTreeRegressor(),
"Random Forest Regressor": RandomForestRegressor(),
"Ada Boost Regressor": AdaBoostRegressor(),
"XG Boost Regressor": xb.XGBRegressor(),
"K Neighbors Regressor": KNeighborsRegressor()
}
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
# 自定义一个评估模型的函数
def evaluate_model(X_train, X_test, y_train, y_test, models):
report = {}
for i in range(len(models)):
model = list(models.values())[i]
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
r2score = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
report[list(models.keys())[i]] = {
"R2 SCORE": r2score,
"MEAN SQUARED ERROR": mse,
"MEAN ABSOLUTE ERROR": mae
}
return report
model_matrics = evaluate_model(X_train, X_test, y_train, y_test, models)
for model, metrics in model_matrics.items():
print(f"{model} Metrics:")
print(f" Accuracy: {metrics['R2 SCORE']}")
print(f" Mean Squared Error: {metrics['MEAN SQUARED ERROR']}")
print(f" Mean Absolute Error: {metrics['MEAN ABSOLUTE ERROR']}")
print("\n" + "=" * 30 + "\n")
# 打印出准确率最高的模型及其准确率
max_accuracy_model = max(model_matrics, key=lambda k: model_matrics[k]['R2 SCORE'])
max_accuracy_value = model_matrics[max_accuracy_model]['R2 SCORE']
print(f"The model with the highest accuracy is '{max_accuracy_model}' with an accuracy of {max_accuracy_value}.")
# 模型效果可视化
best_model = LinearRegression()
best_model.fit(X_train, y_train)
y_test_pred = best_model.predict(X_test)
y_train_pred = best_model.predict(X_train)
plt.figure(figsize=(8, 6))
plt.scatter(y_train, y_train_pred, color='red', label='Train', alpha=0.5)
plt.scatter(y_test, y_test_pred, color='blue', label='Test', alpha=0.5)
plt.plot(y_train, y_train, color='green', linestyle='--', label='Ideal')
plt.xlabel('Actual Prices')
plt.ylabel('Predicted Prices')
plt.title('Scatter Plot: Actual Prices vs. Predicted Prices')
plt.legend()
plt.grid(True)
plt.show()
plt.figure(figsize=(10,6))
y_pred = best_model.predict(X_test)
plt.plot(range(len(y_test))[:200],y_pred[:200],'b',label='predict')
plt.plot(range(len(y_test))[:200],y_test[:200],'r',label='true')
plt.legend(loc='upper right',fontsize=15)
plt.xlabel('the number of house',fontdict={'weight': 'normal', 'size': 15})
plt.ylabel('value of Price',fontdict={'weight': 'normal', 'size': 15})
plt.show()