首页人工智能Scikit-learn10.使用特征预处理提升房...

10.使用特征预处理提升房价预测模型的性能

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%
RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments