数学建模社区-数学中国
标题:
房价预测(线性回归)
[打印本页]
作者:
2744557306
时间:
2024-3-31 16:37
标题:
房价预测(线性回归)
数据集:使用加利福尼亚房价数据集。
1 @. w% O7 X; j4 ^- p# R% D# z8 _
任务:构建一个模型预测加利福尼亚地区的房价。
$ B' [- V6 ?& L& L
挑战:尝试不同的预处理方法(标准化、归一化等)和特征选择技术来改进模型性能。
2 p$ h5 v. Y7 |/ H% i9 \
线性回归是一种预测数值型数据的经典统计方法,它假设目标值和特征之间存在线性关系。在房价预测任务中,我们可以使用线性回归模型来预测基于多个特征(如房屋大小、位置、年龄等)的房价。以下是使用加利福尼亚房价数据集进行房价预测的示例代码,以及如何应用不同的预处理方法和特征选择技术来改进模型性能。
! J4 |) C! U: p0 f+ i7 j
, Z) K7 m: L6 ]3 j" m9 m& H
加载和预处理数据
3 W4 C1 H* Z6 v( L% K5 k
首先,我们从scikit-learn中加载加利福尼亚房价数据集,并进行基本的数据预处理。
from sklearn.datasets import fetch_california_housing
4 w( L- M3 Z! {, x' D
1 o( M3 D" n; W
from sklearn.model_selection import train_test_split
9 ]# g' [4 u+ l: H
" u3 w! i2 i7 e3 c, A# R% J
from sklearn.preprocessing import StandardScaler
# ?: Y" W4 l) Z R) }8 g5 a
b+ ^7 _4 x) Q B8 a* l/ w4 r; o
from sklearn.linear_model import LinearRegression
0 N; f& G( m2 {' {
1 B7 a( P2 v5 b' ^+ l
from sklearn.metrics import mean_squared_error
8 `4 u! s2 h0 R; a R3 r" l
1 Q7 s* J2 |& x
& g6 ` Z6 j7 B* i# ^. B6 O
7 l2 D; n4 F6 Z0 E+ C/ ?% t
# 加载数据集
' e$ I+ Y" X9 S- \/ F; |
& r/ N/ }) z4 y. T
housing = fetch_california_housing()
4 ]1 `; `5 s- W- d, `/ x
6 m; K7 C& X) X
X, y = housing.data, housing.target
1 y0 C; \! E7 T6 O. `4 ~9 ~
( S( p: _& o- V" R3 ]
. w; D1 ?/ }( O$ ~
/ W# r! @; b1 p
# 划分训练集和测试集
; @0 [/ D& i+ Q2 l/ U
& S: ?. @; o# V
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2 `: k0 S. L4 V/ \
0 V5 ~- m6 W7 V; _
) z& q5 S9 ~# U6 L( ]5 b0 V# O# Y
* R4 l! Q9 y" `- t0 _( L0 G: R
# 数据预处理:标准化
5 j! f1 L4 P9 T6 F5 ]5 B- F
2 e: g4 r* O! t1 r+ ~$ ?. V
scaler = StandardScaler()
6 v0 J' S3 d' z6 G$ d6 ?
& m, i9 c" z; L; |2 p
X_train_scaled = scaler.fit_transform(X_train)
- P1 r, e- j' `3 Q4 X$ X# }
7 q1 J" t% |3 d7 y L9 s
X_test_scaled = scaler.transform(X_test)
复制代码
构建和训练线性回归模型
# 创建线性回归模型
# Y B; u) k8 D' R' Y- V V g
model = LinearRegression()
: P, n7 u" i# y/ r; @4 Q$ l& G
6 H; b: N/ t% {3 w
# 训练模型
3 V: y% w& r+ L" X9 T# I
model.fit(X_train_scaled, y_train)
q0 a/ ?. h2 |" ~6 m) N
3 I; c8 P. `1 c V0 _$ w1 A+ h$ O
# 预测测试集
' R+ y0 H) Y4 g3 c1 U
y_pred = model.predict(X_test_scaled)
$ }4 X |" }4 x
" b! l8 M5 O' p7 G% }" A3 h
# 评估模型
( f* d5 ^- I' _: h0 Z/ B
mse = mean_squared_error(y_test, y_pred)
6 N4 l; c; n. E' \
print(f"Mean Squared Error: {mse}")
复制代码
挑战:尝试不同的预处理方法和特征选择
1 W0 }/ U" Z* h; g% g
预处理方法:除了标准化,你还可以尝试归一化(MinMaxScaler)、对数转换等方法,看看它们如何影响模型的性能。
+ i9 E' r2 B4 K
特征选择:可以使用不同的特征选择方法(如SelectKBest, SelectFromModel)来选择最有影响力的特征,这有助于模型专注于最重要的信息,提高预测准确性。
from sklearn.feature_selection import SelectKBest, f_regression
* N9 K. q: C! f6 @# [: j
/ J% X6 ]9 ~/ d. ?
# 特征选择
( K7 f# `$ W8 o1 f. E% g+ J
selector = SelectKBest(score_func=f_regression, k=5)
2 R# o( q" s; v+ a% L9 L
X_train_selected = selector.fit_transform(X_train_scaled, y_train)
( d% {: V/ X' u) I @7 M
X_test_selected = selector.transform(X_test_scaled)
( K d8 O! @, L" ?7 e- n6 d
b- H% Z# C8 u. d
# 使用选择的特征重新训练模型
' j& F8 Y9 @4 N1 J4 ^
model.fit(X_train_selected, y_train)
1 a3 r: Q/ j& \4 F" T
y_pred_selected = model.predict(X_test_selected)
2 C7 z" B, T; L- y2 {
5 J3 V3 }8 k0 {( J
# 评估
2 z9 C7 l H B |, P C/ y" a
mse_selected = mean_squared_error(y_test, y_pred_selected)
% |. I' |, m$ }7 R9 y+ w
print(f"Mean Squared Error with selected features: {mse_selected}")
复制代码
s" p4 g8 @" f; {
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5