1.数据:
依旧使用经典的房价预测数据集。
2.特征工程:
特征类型主要有以下几种:
2.1 数值型特征
如:长度、宽度、像素值等。
当特征值范围不一致时,通常需要做数值范围归一化处理。
如:最大最小归一化:
2.2 有序型特征
如:等级(A、B、C)、级别(低、中、高)等。
转换成有序数值即可
如:A->1、B->2、C->3
2.3 类别型特征
如:性别(男、女)等。
类别是没有大小等级之分的,通常不直接转换为有序数值。一般处理成独热编码(One-Hot Encoding)
如:男->0 1、女->1 0:
3.sklearn中使用:
归一化:scaler = MinMaxScaler()
独热编码:encoder = OneHotEncoder(sparse=False)
训练集上进行的操作:scaler.fit_transform() encoder.fit_transform()
测试机上进行的操作:scaler.transform() encoder.transform()
4.代码:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import OneHotEncoder,MinMaxScaler
data_file = './data/house_data.csv'
# 特征列
# 数值型特征列
numeric_features = ['sqft_living', 'sqft_above', 'sqft_basement', 'long', 'lat']
# 类别型特征列
category_feature = ['waterfront']
def process_features(X_train,X_test):
"""
特征预处理
"""
# 1、对类别型特征进行独热编码处理
# 编码器默认返回稀疏数据,设置sparse=False就不返回稀疏数据了
encoder = OneHotEncoder(sparse=False)
encoderd_train_feature = encoder.fit_transform(X_train[category_feature])
encoderd_test_feature = encoder.transform(X_test[category_feature])
# 2、对数值型特征进行归一化处理
scaler = MinMaxScaler()
scalerd_train_feature = scaler.fit_transform(X_train[numeric_features])
scalerd_test_feature = scaler.transform(X_test[numeric_features])
# 3、预处理特征合并
X_train_processed = np.hstack((encoderd_train_feature,scalerd_train_feature))
X_test_processed = np.hstack((encoderd_test_feature,scalerd_test_feature))
return X_train_processed,X_test_processed
def main():
"""
主函数
"""
# 读取数据
house_data = pd.read_csv(data_file,usecols=numeric_features+category_feature+['price'])
# 获取数据集特征
X = house_data[numeric_features+category_feature]
# 获取数据集标签
y = house_data['price']
# 分割数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=1/3,random_state=10)
# 声明模型
linear_regression_model = LinearRegression()
# 训练模型
linear_regression_model.fit(X_train,y_train)
# 评价模型
r2_score = linear_regression_model.score(X_test,y_test)
print('模型的R2值为:',r2_score)
# 数据预处理之后的效果
X_train_processed, X_test_processed = process_features(X_train,X_test)
# 声明模型
linear_regression_model_two = LinearRegression()
# 训练模型
linear_regression_model_two.fit(X_train_processed, y_train)
# 评价模型
r2_score_two = linear_regression_model_two.score(X_test_processed, y_test)
print('进行特征预处理之后,模型的R2值为:', r2_score_two)
print('模型效果提升了{:.2f}%'.format((r2_score_two - r2_score) / r2_score *100))
if __name__ == '__main__':
main()
5.输出结果:
模型的R2值 0.6268785585994627
特征处理后,模型的R2值 0.6272194175852761
模型提升了0.05%