房价模型构建实战(一)——赛题分析

认识数据


在构建模型前或者在数据分析前需要对数据有个清楚的认识,无论是对于数据竞赛还是企业项目,对于数据的认识往往是第一位的,这直接影响到最终的结果。本文是利用一个竞赛向大家进行介绍的,故根据比赛背景介绍如何对数据进行认识。了解比赛的背景、知道你要构建的模型种类。比赛要求参赛选手根据给定的数据集,建立模型,预测房屋租金。数据集中的数据类别包括租赁房源、小区、二手房、配套、新房、土地、人口、客户、真实租金等。这是典型的回归预测。

1、数据集导入

#导入warnings包,利用过滤器来实现忽略警告语句。
import warnings
warnings.filterwarnings('ignore')

# GBDT
from sklearn.ensemble import GradientBoostingRegressor
# XGBoost
import xgboost as xgb
# LightGBM
import lightgbm as lgb

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#载入数据
data_train = pd.read_csv('./dataset/train_data.csv')
data_train['Type'] = 'Train'
data_test = pd.read_csv('./dataset/test_a.csv')
data_test['Type'] = 'Test'
data_all = pd.concat([data_train, data_test], ignore_index=True)

2、基本情况查看

info()函数可以显示出数据中所有变量的情况,而describe()函数仅显示数值型数据的相关情况。下面分别来看一下结果。
info()

可以看出此数据包括数值型数据也包括离散型数据,且有两个变量“pv”和“uv”分别表示“该板块当月租客浏览网页次数”和“该板块当月租客浏览网页总人数”;目标变量为tradeMoney,大多数数据都是int或float型;有部分字段是object型,即文本型中文或英文的,如rentType字段,这些字段在之后需要做处理。


describe()

3、缺失值分析

从上面的分析其实已经知道了哪些变量具有缺失值。这里通过函数来进行缺失值分析。

def missing_values(df):
    alldata_na = pd.DataFrame(df.isnull().sum(),columns={'missingNum'})
    alldata_na['existNum'] = len(df) - alldata_na['missingNum'] #显示变量分缺失值的个数
    alldata_na['sum'] = len(df) #总的样本个数
    alldata_na['missingRatio'] = alldata_na['missingNum']/len(df)*100  #缺失率
    alldata_na['dtype'] = df.dtypes
    #ascending:m默认True升序
    alldata_na = alldata_na[alldata_na['missingNum']>0].reset_index().sort_values(by=['missingNum','index'],ascending=[False,True])
    alldata_na.set_index('index',inplace=True)
    
    return alldata_na

missing_values(data_train)

4、单调特征列分析

#是否有单调特征列(单调特征列很大可能为时间列)
def incresing(vals):
    cnt = 0
    len_ = len(vals)
    for i in range(len_-1):
        if vals[i+1] > vals[i]:
            cnt += 1
    return cnt

fea_cols = [col for col in data_train.columns]
for col in fea_cols:
    cnt = incresing(data_train[col].values)
    if cnt / data_train.shape[0] >= 0.55:
        print('单调特征:',col)
        print("单调特征值个数:",cnt)
        print("单调特征值比例:",cnt / data_train.shape[0])

5、特征nunique分布

#特征nunique分布
for feature in categorical_feas:
    print(feature + "的特征分布如下:")
    print(data_train[feature].value_counts())
    if feature != 'communityName':#值太多,暂不画图
        plt.hist(data_train[feature],bins=3)
        plt.show()

rentType:4种,且绝大多数是无用的未知方式;
houseType:104种,绝大多数在3室及以下;
houseFloor:3种,分布较为均匀;
region: 15种;
plate: 66种;
houseToward: 10种;
houseDecoration: 4种,一大半是其他;
buildYear: 80种;
communityName: 4236种,且分布较为稀疏;
此步骤是为之后数据处理和特征工程做准备,先理解每个字段的含义以及分布,之后需要根据实际含义对分类变量做不同的处理。
 

6、统计特征频次大于100的特征

# 统计特征值出现频次大于100的特征
for feature in categorical_feas:
    df_value_counts = pd.DataFrame(data_train[feature].value_counts())
    df_value_counts = df_value_counts.reset_index()
    df_value_counts.columns = [feature, 'counts'] # change column names
    print(df_value_counts[df_value_counts['counts'] >= 100])

7、Label分布

# Labe 分布
fig,axes = plt.subplots(2,3,figsize=(20,5))
fig.set_size_inches(20,12)
sns.distplot(data_train['tradeMoney'],ax=axes[0][0])
sns.distplot(data_train[(data_train['tradeMoney']<=20000)]['tradeMoney'],ax=axes[0][1])
sns.distplot(data_train[(data_train['tradeMoney']>20000)&(data_train['tradeMoney']<=50000)]['tradeMoney'],ax=axes[0][2])
sns.distplot(data_train[(data_train['tradeMoney']>50000)&(data_train['tradeMoney']<=100000)]['tradeMoney'],ax=axes[1][0])
sns.distplot(data_train[(data_train['tradeMoney']>100000)]['tradeMoney'],ax=axes[1][1])

发布了8 篇原创文章 · 获赞 1 · 访问量 195

猜你喜欢

转载自blog.csdn.net/Moby97/article/details/103881014