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