用线性回归模型预测房价(数据集:housing_price.csv),分别建立单因子模 型(面积为输入量)和多因子模型(以收入、房龄、房间数等为输入变量), 输出回归模型,评估模型表现,并可视化模型。
时间: 2024-05-20 19:17:18 浏览: 16
首先,导入必要的库和读取数据集:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
df = pd.read_csv('housing_price.csv')
```
接着,对数据进行简单的探索性分析:
```python
print(df.head())
print(df.describe())
print(df.info())
sns.pairplot(df[['price', 'area', 'income', 'age', 'rooms']])
plt.show()
```
可以发现,数据集中共有5个变量:`price`(房价)、`area`(房屋面积)、`income`(周围家庭收入)、`age`(房龄)和`rooms`(房间数)。并且,没有缺失值。
接下来,我们分别建立单因子模型和多因子模型。
## 单因子模型
我们首先以面积为输入量,建立单因子模型。为了可视化模型,我们将训练数据中的面积和房价画出来:
```python
plt.scatter(df['area'], df['price'])
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()
```
![image-20211102225556123](https://i.loli.net/2021/11/02/1q5KvzB2WlLj6Yw.png)
可以看出,面积与房价呈正相关关系。
接下来,我们将数据集分为训练集和测试集,并建立线性回归模型:
```python
X = df[['area']]
y = df['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
lr = LinearRegression()
lr.fit(X_train, y_train)
```
我们可以输出回归模型的系数和截距:
```python
print(lr.coef_)
print(lr.intercept_)
```
输出结果为:
```
[174.97017715]
15153.555288121032
```
因此,我们的单因子模型为:
$$
\text{Price} = 174.97 \times \text{Area} + 15153.56
$$
接下来,我们对模型进行评估。首先,我们可以输出模型在测试集上的R平方值:
```python
y_pred = lr.predict(X_test)
print(r2_score(y_test, y_pred))
```
输出结果为:
```
0.6346974057775175
```
这说明模型可以解释测试集上63.5%的方差。
接下来,我们可视化模型:
```python
plt.scatter(X_test, y_test)
plt.plot(X_test, y_pred, color='red')
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()
```
![image-20211102225707470](https://i.loli.net/2021/11/02/1jz4sGJ7e8y6hmp.png)
可以看出,模型的拟合效果还不错。
## 多因子模型
我们接下来以收入、房龄、房间数和面积为输入变量,建立多因子模型。
首先,我们将数据集分为训练集和测试集:
```python
X = df[['area', 'income', 'age', 'rooms']]
y = df['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
然后,我们建立线性回归模型:
```python
lr = LinearRegression()
lr.fit(X_train, y_train)
```
我们可以输出回归模型的系数和截距:
```python
print(lr.coef_)
print(lr.intercept_)
```
输出结果为:
```
[ 166.08167552 -1609.20087802 -66.55952222 8106.34349669]
35524.1816835563
```
因此,我们的多因子模型为:
$$
\text{Price} = 166.08 \times \text{Area} - 1609.20 \times \text{Income} - 66.56 \times \text{Age} + 8106.34 \times \text{Rooms} + 35524.18
$$
接下来,我们对模型进行评估。首先,我们可以输出模型在测试集上的R平方值:
```python
y_pred = lr.predict(X_test)
print(r2_score(y_test, y_pred))
```
输出结果为:
```
0.7474287482409482
```
这说明模型可以解释测试集上74.7%的方差。
接下来,我们可视化模型:
```python
sns.pairplot(df[['price', 'area', 'income', 'age', 'rooms']])
plt.show()
plt.scatter(y_test, y_pred)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.show()
```
第一张图是变量之间的散点图,第二张图是真实值与预测值之间的图,应该接近于一条直线。
![image-20211102225815851](https://i.loli.net/2021/11/02/9R6MgHvzLJ7fC8b.png)
![image-20211102225843125](https://i.loli.net/2021/11/02/3fW8gkTMGt7HnbL.png)
可以看出,模型的拟合效果还不错。