房价预测
导入数据集
导入三个数据集,index_col=0表示将数据集第一列作为索引,如果数据集自带索引可以使用此属性。训练集里data和target放在一个csv里,测试集中的data和target放在两个csv.我们将测试集的target
和data放在一个csv里,这样更方便缺失值的处理。
1 import pandas as pd 2 train=pd.read_csv('train.csv',index_col=0) 3 test=pd.read_csv('test.csv',index_col=0) 4 sub=pd.read_csv('sub.csv',index_col=0) 5 test['SalePrice']=sub['SalePrice']
查看缺失率
训练集缺失率
1 #训练集数值特征 2 train_number_tz = train.iloc[:,0:-1].dtypes[train.dtypes != "object"].index 3 # 训练集非数值特征 4 train_str_tz = train.iloc[:,0:-1].dtypes[train.iloc[:,0:-1].dtypes == "object"].index 5 # 计算两类特征的缺失率并排行 6 miss = 100 * train.loc[:, train_number_tz].isnull().mean() 7 train_num_rank=miss[miss.values > 0].sort_values(ascending=False) 8 miss = 100 * train.loc[:, train_str_tz].isnull().mean() 9 train_str_rank=miss[miss.values > 0].sort_values(ascending=False)
训练集缺失率如下。


图1-1数值型特征数据缺失率 图1-2非数值型缺失率
测试集缺失率
# 数值特征 test_number_tz = test.iloc[:,0:-1].dtypes[test.dtypes != "object"].index # 非数值特征 test_str_tz = test.iloc[:,0:-1].dtypes[test.iloc[:,0:-1].dtypes == "object"].index # 计算缺失率 miss = 100 * test.loc[:, test_number_tz].isnull().mean() test_num_rank=miss[miss.values > 0].sort_values(ascending=False) miss = 100 * test.loc[:, test_str_tz].isnull().mean() test_str_rank=miss[miss.values > 0].sort_values(ascending=False)
测试集缺失率如下.


图1-3数值型特征数据缺失率 图1-4非数值型特征数据缺失率
数据预处理
特征处理
1 # 训练集和测试集有4个共同的缺失率很高的特征,我们直接舍弃 2 dellist=['PoolQC', 'MiscFeature', 'Alley', 'Fence'] 3 train=train.drop(dellist,axis=1) 4 test=test.drop(dellist,axis=1)
数值型数据处理
1 # 数值型数据我们采用中位数或者平均数填充 2 train[train_number_tz]=train[train_number_tz].fillna(train[train_number_tz].mean()) 3 test[test_number_tz]=test[test_number_tz].fillna(test[test_number_tz].mean())
字符型数据处理
1 # 字符型数据缺失我们用unknow填充,但不是给所有非数值特征缺失值都用unknow填充,我们给他们共有的一部分属性用unknow填充,其他特征缺失的数据直接整条舍弃,这样更有利于后面编码。 2 commonlist=['FireplaceQu', 'GarageType', 'GarageFinish', 'GarageQual', 'GarageCond', 3 'BsmtExposure', 'BsmtFinType2', 'BsmtQual', 'BsmtCond', 'BsmtFinType1'] 4 train[commonlist]=train[commonlist].fillna('unknow') 5 train.dropna(axis=0,inplace=True) 6 test[commonlist]=test[commonlist].fillna('unknow') 7 test.dropna(axis=0,inplace=True)
数据分割
缺失值处理完后,我们将数据集里面的data和target分开。
1 train_data=train.iloc[:,0:-1] 2 train_target=train['SalePrice'] 3 test_data=train.iloc[:,0:-1] 4 test_target=train['SalePrice']
哑编码
字符型数据我们不能直接训练,需要对它们进行编码再与数值型数据结合。
1 # 哑编码 2 train_data_strout=train_data[train_str_tz] 3 traincode=pd.get_dummies(train_data_strout) 4 test_data_strout=test_data[test_str_tz] 5 testcode=pd.get_dummies(test_data_strout) 6 # 将哑编码后的数据与数值型数据结合组成最终数据 7 traindata_ult=pd.concat([train_data[train_number_tz],traincode],axis=1) 8 testdata_ult=pd.concat([test_data[test_number_tz],testcode],axis=1)
模型训练
1.线性回归模型
1 from sklearn.linear_model import LinearRegression 2 lr = LinearRegression() 3 lr.fit(traindata_ult, train_target) 4 lr.score(testdata_ult,test_target)
评分如下图.

图2-1线性回归模型评分
2.线性核函数配置的支持向量机回归训练
1 from sklearn.svm import SVR 2 # 使用线性核函数配置的支持向量机进行回归训练,并且对测试样本进行预测。 3 linear_svr = SVR(kernel='linear') 4 linear_svr.fit(traindata_ult, train_target) 5 linear_svr.score(testdata_ult,test_target)
评分如图2-2

图2-2支持向量机回归模型评分
3.K-近邻回归平均算法
1 # 从sklearn.neighbors导入KNeighborRegressor(K近邻回归器)。 2 from sklearn.neighbors import KNeighborsRegressor 3 # 初始化K近邻回归器,并且调整配置,使得预测的方式为平均回归:weights='uniform'。 4 uni_knr = KNeighborsRegressor(weights='uniform') 5 uni_knr.fit(traindata_ult, train_target) 6 uni_knr.score(testdata_ult,test_target)
评分如图2-3.

图2-3K-近邻回归平均算法评分
4.K-近邻回归权重算法
# 初始化K近邻回归器,并且调整配置,使得预测的方式为根据距离加权回归:weights='distance'。 dis_knr = KNeighborsRegressor(weights='distance') dis_knr.fit(traindata_ult, train_target) dis_knr.score(testdata_ult,test_target)
评分如图2-4

图2-4 K-近邻回归权重算法评分

浙公网安备 33010602011771号