其他分享
首页 > 其他分享> > 9_波士顿房价(93预测率)

9_波士顿房价(93预测率)

作者:互联网

之前做过一期房价预测的机器学习,但当时不知道如何处理字符串数据,同时对数据预处理理解不深,导致最后不了了之。现在学习了哑变量以及数据清洗,再次做这个

题目时发现挺简单的,同时我也总结一套预测套路。

 

导入数据集

import pandas as pd
train=pd.read_csv('train.csv',index_col=0)
test=pd.read_csv('test.csv',index_col=0)
sub=pd.read_csv('sub.csv',index_col=0)
test['SalePrice']=sub['SalePrice']

首先导入三个数据集,index_col=0表示将数据集第一列作为索引,如果数据集自带索引可以使用此属性。测试集中的data和target是分开的,这里我们将测试集里特征和结果放在一个表里。

接下来查看缺失率

复制代码
# %%
# Numeric features
train_number_tz = train.iloc[:,0:-1].dtypes[train.dtypes != "object"].index
# Categorical features
train_str_tz = train.iloc[:,0:-1].dtypes[train.iloc[:,0:-1].dtypes == "object"].index
# 这里的data只包含特征数据
miss = 100 * train.loc[:, train_number_tz].isnull().mean()
train_num_rank=miss[miss.values > 0].sort_values(ascending=False)
miss = 100 * train.loc[:, train_str_tz].isnull().mean()
train_str_rank=miss[miss.values > 0].sort_values(ascending=False)
复制代码 复制代码
# Numeric features
test_number_tz = test.iloc[:,0:-1].dtypes[test.dtypes != "object"].index
# Categorical features
test_str_tz = test.iloc[:,0:-1].dtypes[test.iloc[:,0:-1].dtypes == "object"].index
# 这里的test只包含特征数据
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)
复制代码

 

数值型缺失值我们可以用平均值或者中位数填充,比较好处理。对于字符型数据,我们发现有几项缺失率过高,应该直接舍弃。剩下的字符型缺失值用unknow填充,可以吗?

不行,因为训练集和测试集字符型缺失个数不一致,也就是说如果都用unknow填充,测试集用哑变量处理后特征项会比训练集处理后的特征项多(多的几项为 格式为 : 特征_unknow)

我们可以用unknow填充他们共有的缺失值,剩下较少的数据直接舍弃。

# 舍弃缺失率极高的几个特征
dellist=['PoolQC', 'MiscFeature', 'Alley', 'Fence']
train=train.drop(dellist,axis=1)
test=test.drop(dellist,axis=1)

# 数值型数据填充
train[train_number_tz]=train[train_number_tz].fillna(train[train_number_tz].mean())
test[test_number_tz]=test[test_number_tz].fillna(test[test_number_tz].mean())

# 字符型数据填充
commonlist=['FireplaceQu', 'GarageType', 'GarageFinish', 'GarageQual', 'GarageCond',
       'BsmtExposure', 'BsmtFinType2', 'BsmtQual', 'BsmtCond', 'BsmtFinType1']
train[commonlist]=train[commonlist].fillna('unknow')
train.dropna(axis=0,inplace=True)
test[commonlist]=test[commonlist].fillna('unknow')
test.dropna(axis=0,inplace=True)

处理完毕后,测试集和训练集以及没有缺失值了,于是可以将data和target分开了。iloc是一个切片函数,参数是索引值,与它类似的还有一个loc函数,参数可以直接用特征值加引号。iloc在下面代码里的

意思是切割train数据集里面所有行,从第一列到最后一列(不包括最后一列)。

train_data=train.iloc[:,0:-1]
train_target=train['SalePrice']
test_data=train.iloc[:,0:-1]
test_target=train['SalePrice']

对字符型数据进行哑编码

train_data_strout=train_data[train_str_tz]
traincode=pd.get_dummies(train_data_strout)
test_data_strout=test_data[test_str_tz]
testcode=pd.get_dummies(test_data_strout)

将数值型数据和编码后的字符型数据结合作为data

traindata_ult=pd.concat([train_data[train_number_tz],traincode],axis=1)
testdata_ult=pd.concat([test_data[test_number_tz],testcode],axis=1)

导入模型训练

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(traindata_ult, train_target)
lr.score(testdata_ult,test_target)

查看评分

 

 

 

 

标签:tz,房价,miss,number,train,test,93,波士顿,data
来源: https://www.cnblogs.com/ld66/p/15338767.html