数学建模社区-数学中国
标题:
房价预测(线性回归)
[打印本页]
作者:
2744557306
时间:
2024-3-31 16:37
标题:
房价预测(线性回归)
数据集:使用加利福尼亚房价数据集。
$ F! _- F/ P4 m* u5 E
任务:构建一个模型预测加利福尼亚地区的房价。
" H4 n! E) l; Q1 _9 S8 t; {0 @4 S( u
挑战:尝试不同的预处理方法(标准化、归一化等)和特征选择技术来改进模型性能。
# k: A; ~9 r B* h& Z% D' {
线性回归是一种预测数值型数据的经典统计方法,它假设目标值和特征之间存在线性关系。在房价预测任务中,我们可以使用线性回归模型来预测基于多个特征(如房屋大小、位置、年龄等)的房价。以下是使用加利福尼亚房价数据集进行房价预测的示例代码,以及如何应用不同的预处理方法和特征选择技术来改进模型性能。
' b0 K: ?3 I6 c8 A
, p& n5 D9 F. g0 {2 S3 y3 ]
加载和预处理数据
# B6 m" a- H) k! M
首先,我们从scikit-learn中加载加利福尼亚房价数据集,并进行基本的数据预处理。
from sklearn.datasets import fetch_california_housing
3 }# |. W$ Q% m8 G+ f* V3 }
7 D+ L: ?$ G6 i" u* j; t5 w: g
from sklearn.model_selection import train_test_split
8 F, x& o3 l$ ]( m1 [- u7 s
: N. X* }+ d( _: w% e: O
from sklearn.preprocessing import StandardScaler
5 o4 v2 c) O$ ^, c4 z% ~
2 `" [9 q4 V6 ]9 e" n( T9 D% G
from sklearn.linear_model import LinearRegression
4 `3 ]6 ~# x+ `: g, _- Y, n O
4 J: z3 [# h- }3 a0 j# h1 s& [! h
from sklearn.metrics import mean_squared_error
# O9 s0 a+ W; x0 u+ u. @' H+ ~% Q
- _; H; w+ z0 i. x7 q6 @6 H; Q4 L" y
$ ]' p( A- ^$ Z6 o% Y/ _
. D$ x. h ]' d1 q. n3 J" }
# 加载数据集
# Y0 M$ {8 s9 m* V1 d; W3 Y, h
) o- R: o S7 ~. x( X
housing = fetch_california_housing()
. I y3 }! \0 C3 N( K
0 ^+ ?& K& X' d2 e( P
X, y = housing.data, housing.target
' ~2 |1 o& a) v" C+ e
/ \$ s( H8 i8 a! [# {8 ^+ p* u; _4 M
6 @7 v" h3 ^' p. w+ K$ d1 L
7 H9 ?" D. X3 _1 ~3 W+ `. w/ \
# 划分训练集和测试集
: Q2 H. V( K5 p4 p+ |' Z2 ?4 f9 G2 B
* G, g* L" q7 @5 \) ~
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
: Y4 a) t0 y. o, |9 \% N" S
) M( t; q- V, @2 c' Z/ N
4 r8 L1 i6 R/ n# G! v+ M3 [% _ T. b
) c( k# t" q9 x8 f$ Q; J, A
# 数据预处理:标准化
1 \: N; V R6 M( N. c8 B) t/ x7 k
9 ?1 ~4 B( D. B1 `) A
scaler = StandardScaler()
2 E: d7 |2 }8 J' g
" P( k* o* ^6 I/ @
X_train_scaled = scaler.fit_transform(X_train)
. B+ E- N' q c
+ f" D$ Y8 X5 w- H4 B& T
X_test_scaled = scaler.transform(X_test)
复制代码
构建和训练线性回归模型
# 创建线性回归模型
* \& f: J% [7 D3 I+ o) C
model = LinearRegression()
4 N3 u; ?7 |+ Q% l
2 s' ~: L D1 B' r0 P* f
# 训练模型
/ k" C# t% c0 Q1 g: c5 n7 r
model.fit(X_train_scaled, y_train)
; s! C# H0 R" x' A2 N/ W
' e* A4 w/ b9 P2 r) d3 O
# 预测测试集
9 ?- K( M' H$ Y2 \' \
y_pred = model.predict(X_test_scaled)
& ]6 z9 V* T7 g1 G4 T% _3 c# }
3 \, u/ w6 W' R7 c. m, b/ c% ]. F
# 评估模型
$ Z+ K' {' C- N+ o1 ^/ \
mse = mean_squared_error(y_test, y_pred)
0 v# Y v+ U+ U. \1 t
print(f"Mean Squared Error: {mse}")
复制代码
挑战:尝试不同的预处理方法和特征选择
* [4 D$ }" P r& v/ Z) d5 E
预处理方法:除了标准化,你还可以尝试归一化(MinMaxScaler)、对数转换等方法,看看它们如何影响模型的性能。
3 {- p+ f; [! Q4 @( R0 {
特征选择:可以使用不同的特征选择方法(如SelectKBest, SelectFromModel)来选择最有影响力的特征,这有助于模型专注于最重要的信息,提高预测准确性。
from sklearn.feature_selection import SelectKBest, f_regression
7 ]7 |+ I+ u1 E* r0 i- ~7 z, f
8 n. W% Y0 g ^ { {
# 特征选择
5 [# S$ P2 |* m/ Q& a" I8 P1 y
selector = SelectKBest(score_func=f_regression, k=5)
# U2 e* `+ u2 `7 a; {+ T
X_train_selected = selector.fit_transform(X_train_scaled, y_train)
$ }( C' F, `% h5 K; I! x8 Q( X
X_test_selected = selector.transform(X_test_scaled)
5 q$ q3 y, X l6 k
3 D' W! `3 V5 W) W
# 使用选择的特征重新训练模型
' E0 D3 G7 O' l$ k4 [$ m
model.fit(X_train_selected, y_train)
9 v" n! V) w5 \6 O* r4 v6 n' n
y_pred_selected = model.predict(X_test_selected)
" N' Y, m: }, U3 {3 [* T
: M! {! o9 j7 t6 V9 D
# 评估
. P: Q2 J; p+ }, i3 W: m
mse_selected = mean_squared_error(y_test, y_pred_selected)
6 D5 a" o4 |7 h6 J7 x1 ]
print(f"Mean Squared Error with selected features: {mse_selected}")
复制代码
0 k" t; t+ l8 ]) N3 @
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5