特征工程---Boston房价预测

1、什么是特征工程

特征工程是对原始特征做必要的数据预处理和特征编码,使得变换后的特征符合模型要求。

数据预处理好理解,那么什么是特征编码?

2、特征编码

特征编码分为离散型特征编码和数值型(连续)特征编码

  • 离散型特征编码

         离散特征可以通过独热编码(one-hot encode),将原来有K种取值的离散型特征变成K维0-1编码特征,这K维特征中只有一个是1(独热),其余维是0,独热编码可以用pandas的get_dummies方法(哑编码),或者Scikit-Learn中的OneHotEncoder类实现。

        get_dummies方法要求输入特征的类型是非数值型('object');而OneHotEncoder要求输入是整数。如果是字符串要先用LabelEncoder变成整数(但是LabelEncoder 输出是一维(1D)数组,而OneHotEncoder要求输出是2D数组,需要在二者之间做格式转换,否则会报错

        另外如果训练数据和测试数据不能同时获得的话,需要用OneHotEncoder用训练集训练编码器,然后对训练集和测试集进行编码;而get_dummies是依赖于DataFrame,只适用于一个数据集的情况(注意DataFrame和Series的区别,。DataFrame是一张表,而Series是表里的某一行或某一列)

  • 数值型特征编码

       Scikit-Learn中提供的数据预处理功能。

       在数据探索阶段如果发现数据的各特征差异较大,需要进行数据标准化预处理,标准化的目的在于避免原始特征值差异过大,导致训练得到的参数权重、单位不一致,无法比较各特征的重要性。另外,一些优化算法(如随机梯度下降法)只有在各特征尺度差不多的情况下才能保证收敛。

3、对波士顿房价的数据做特征工程

代码如下:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import sklearn.datasets
from sklearn import preprocessing
#from sklearn.preprocessing import StandardScaler
import warnings
df=pd.read_csv('boston_house_prices.csv')

#1、数据去噪,将房价大于等于50的去掉
df=df[df.MEDV<50]
#print(df.shape)
#取出MEDV列的数据给y
y=df['MEDV']
#y=np.reshape(y,(-1,1))
X=df.drop('MEDV',axis=1)
#对房屋价格做log变换
log_y=np.log1p(y)

#2、对RAD做独热编码
X['RAD'].astype('object')
X_cat=X['RAD']
X_cat=pd.get_dummies(X_cat,prefix='RAD')
X=X.drop('RAD',axis=1)
#特征名称,用于保存特征工程结果
feature_names=X.columns
print(X_cat.head())

#数值的标准化处理
#3、特征编码
ss_X=preprocessing.StandardScaler()
ss_y=preprocessing.StandardScaler()
ss_log_y=preprocessing.StandardScaler()
X=ss_X.fit_transform(X)
y=ss_y.fit_transform(y.values.reshape(-1,1))
log_y=ss_y.fit_transform(log_y.values.reshape(-1,1))

#4、保存特征工程的结果到文件,供机器学习模型使用
fe_data=pd.DataFrame(data=X,columns=feature_names,index=df.index)
fe_data=pd.concat([fe_data,X_cat],axis=1,ignore_index=False)
#加上标签y
fe_data['MEDV']=y
fe_data['log_MEDV']=log_y
#保存结果到文件
fe_data.to_csv('FE_boston_housing.csv',index=False)
print(fe_data.head())
print(fe_data.info())

未处理前的数据:

    

处理后的前5行数据:

    

处理后的数据总览:

    

 

 

 

### 使用K-近邻(KNN)回归模型预测波士顿房价 #### 导入必要的库和加载数据集 为了实现KNN回归模型并用于波士顿房价预测,首先需要导入所需的Python库以及获取波士顿房价的数据集。由于`sklearn.datasets`中的波士顿房价数据集已被移除,可选用其他公开可用的类似数据集或创建自己的数据集。 ```python import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsRegressor from sklearn.metrics import mean_squared_error, r2_score from sklearn.datasets import load_boston # 注意:此方法已弃用,在较新版本中可能无法使用 import matplotlib.pyplot as plt ``` 考虑到官方已经不再推荐使用`load_boston()`函数来加载波士顿房价数据集[^4],建议读者寻找替代方案,比如从UCI机器学习库下载最新版数据集或其他房地产价格数据集。 #### 数据预处理 一旦获得了适当的数据源,则应执行以下操作: 1. **分割训练集与测试集** 将整个数据集划分为两个部分——一部分用来训练模型(即让计算机学会如何做),另一部分则保留下来评估模型性能。 2. **标准化特征变量** 对输入特征进行缩放处理,使得它们具有零均值和单位方差,从而提高某些算法的表现力。 ```python # 加载数据集(假设我们有一个有效的boston_data对象) X = boston_data.data y = boston_data.target # 划分训练集/测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 特征缩放 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) ``` #### 构建与训练KNN回归器 接下来定义一个KNN回归器实例,并利用之前准备好的训练数据对其进行拟合。这里选择了一个相对较小的\(k\)值作为起点;然而,在实际应用过程中应当尝试不同的\(k\)值以找到最优解。 ```python # 创建KNN回归器 knn_regressor = KNeighborsRegressor(n_neighbors=5) # 训练模型 knn_regressor.fit(X_train_scaled, y_train) ``` #### 预测与评价 完成上述步骤之后就可以开始做出预测了。对于每组输入特征向量,模型会返回对应的预期目标值。最后一步是对模型的效果进行全面衡量,通常包括但不限于均方误差(MSE)、决定系数(\(R^2\))等指标。 ```python # 进行预测 predictions = knn_regressor.predict(X_test_scaled) # 输出前几个预测结果对比真实值 print("Predicted prices:", predictions[:5]) print("Actual prices :", y_test[:5]) # 性能评估 mse = mean_squared_error(y_test, predictions) r2 = r2_score(y_test, predictions) print(f'Mean Squared Error: {mse:.2f}') print(f'R-squared Score: {r2:.2f}') # 可视化比较 plt.scatter(range(len(predictions)), predictions, color='blue', label="Prediction", alpha=0.7) plt.plot(y_test, 'ro-', linewidth=2, markersize=8, label="True Value") plt.legend(loc="best") plt.title('Comparison between Predictions and True Values') plt.show() ``` 通过以上过程可以看出,虽然KNN作为一种简单的非参数技术能够快速上手实践,但在面对复杂多变的真实世界问题时仍存在局限性。因此,在具体项目开发期间还需综合考虑更多因素,如特征工程优化、超参数调优乃至探索更加先进的机器学习框架和技术栈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值