美文网首页
机器学习之工程实现一《以房价预测xgboost实现为例的基本工具

机器学习之工程实现一《以房价预测xgboost实现为例的基本工具

作者: 小螳螂 | 来源:发表于2019-01-01 11:13 被阅读0次

jupyter NoteBook

导入包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
plt.style.use('ggplot')

from sklearn.base import BaseEstimator, TransformerMixin, RegressorMixin, clone
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import RobustScaler, StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.pipeline import Pipeline, make_pipeline
from scipy.stats import skew
from sklearn.decomposition import PCA, KernelPCA
from sklearn.preprocessing import Imputer

from sklearn.model_selection import cross_val_score, GridSearchCV, KFold
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, ExtraTreesRegressor
from sklearn.svm import SVR, LinearSVR
from sklearn.linear_model import ElasticNet, SGDRegressor, BayesianRidge
from sklearn.kernel_ridge import KernelRidge
from xgboost import XGBRegressor

第1步 读取数据

train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')

解决行和列显示不全的问题
#显示所有列
pd.set_option('display.max_columns', None)
#显示所有行
pd.set_option('display.max_rows', None)
#设置value的显示长度为100,默认为50
pd.set_option('max_colwidth',100)

第2步 探索性可视化 Exploratory Visualization

2-1

plt.figure(figsize=(15,8))
sns.boxplot(train.YearBuilt,train.SalePrice)

笔记 01: plt.figure画布设置

def figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=Figure, clear=False, **kwargs)

plt.figure常用参数:

  1. num :如果此参数没有提供,则一个新的figure对象将被创建,同时增加figure的计数数值,此数值被保存在figure对象的一个数字属性当中。如果有此参数,且存在对应id的figure对象,则激活对于id的figure对象。如果对应id的figur对象不存在,则创建它并返回它。如果num的值是字符串,则将窗口标题设置为此字符串。

  2. figsize:以英寸为单位的宽高,缺省值为 rc figure.figsize (1英寸等于2.54厘米)

  3. plt.xlim,plt.ylim限制横坐标和纵坐标的显示范围

  4. dpi:图形分辨率,缺省值为rc figure.dpi

  5. facecolor:背景色

  6. edgecolor:边框颜色

  7. frameon:默认值True为绘制边框,如果为False则不绘制边框

  8. FigureClass:matplotlib.figure.Figure派生类,从派生类创建figure实例

  9. clear:重建figure实例

2-2

plt.figure(figsize=(12,6))
plt.scatter(x=train.GrLivArea,y=train.SalePrice)
plt.xlabel("GrLiveArea",fontsize = 13)
plt.ylabel("SalePrice",fontsize = 13)
plt.ylim(0,800000)

笔记 02 plt.scatter
绘制散点图

参数详解:

参数名称 描述 取值
x,y 长度相等的数组 输入数据
s 标量或者数组,可选,默认为20 size in points^2
c 颜色序列 rgb或rgba的二维数组
marker 散点图点的形状 默认为‘o’,点.{".":点,”,“:像素,”v“:倒三角}
cmap Colormap对象,默认为:None Colormap
norm Normalize 数据亮度0-1,float数据
vmin,vmax 亮度 若norm已使用,该参数无效
alpha 透明度 0-1
linewidth 标量或者数组,线的宽度 **

根据可视化的结果可以做出合理的数据预处理
比如:

train.drop(train[(train['GrLivArea']>4000)&(train["SalePrice"]<300000)].index,inplace=True) #删除观察到的噪声点

第3步 数据清洗

3-1

full=pd.concat([train,test], ignore_index=True)#将训练集合测试集合并在一起处理
full.drop(['Id'],axis=1, inplace=True)#删除Id列,参数inplace为True时,替换原来的数据
full.shape

关于concat的使用详见pd.concat

3-2 统计为空的数据个数

aa = full.isnull().sum() #统计为空的数据个数
aa[aa>0].sort_values(ascending = Flase) ##个数按从大到小的顺序排列

3-3 填充数据为空列

cols1 = ["PoolQC" , "MiscFeature", "Alley", "Fence", "FireplaceQu", "GarageQual", "GarageCond", "GarageFinish", "GarageYrBlt", "GarageType", "BsmtExposure", "BsmtCond", "BsmtQual", "BsmtFinType2", "BsmtFinType1", "MasVnrType"]
for col in cols1:
    full[col].fillna("None", inplace=True) ##为空的数据填充为字符串”None“,并替换原来的数据
full.groupby(['Neighborhood'])[['LotFrontage']].agg(['mean','median','count'])

**笔记03 groupby() **

一、groupby()分组

A. 分组操作

groupby()进行分组,GroupBy对象没有进行实际运算,只是包含分组的中间数据

按列名分组:obj.groupby(‘label’)

B. 分组运算

对GroupBy对象进行分组运算/多重分组运算,如mean()

非数值数据不进行分组运算

size() 返回每个分组的元素个数

C. 按照自定义的key分组

# 按自定义key分组,列表
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
print(df_obj.groupby(self_def_key).size())

# 按自定义key分组,多层列表
print(df_obj.groupby([df_obj['key1'], df_obj['key2']]).size())

# 按多个列多层分组
grouped2 = df_obj.groupby(['key1', 'key2'])
print(grouped2.size())

# 多层分组按key的顺序进行
grouped3 = df_obj.groupby(['key2', 'key1'])
print(grouped3.mean())
# unstack可以将多层索引的结果转换成单层的dataframe
print(grouped3.mean().unstack())

二、Groupby对象支持迭代操作

每次迭代返回一个元组 (group_name, group_data)

可用于分组数据的具体运算

for group_name, group_data in grouped1:
    print(group_name)
    print(group_data)
    

三、GroupBy对象可以转换成列表或字典

GroupBy对象转换list
print(list(grouped1))

GroupBy对象转换dict
print(dict(list(grouped1)))

四、进阶分组方法

· 按 (列 & 数据类型) 分组

```
print(df_obj.groupby(df_obj.dtypes, axis=1).size())
print(df_obj.groupby(df_obj.dtypes, axis=1).sum())

```

· loc和iloc分组

对于一个DataFrame A,A.loc[k]是读取A中index为k的那一行。A.iloc[k]是读取A中的第k行。

· 通过字典分组

mapping_dict = {'a':'Python', 'b':'Python', 'c':'Java', 'd':'C', 'e':'Java'}
print(df_obj2.groupby(mapping_dict, axis=1).size())
print(df_obj2.groupby(mapping_dict, axis=1).count()) # 非NaN的个数
print(df_obj2.groupby(mapping_dict, axis=1).sum())


· 通过索引级别分组

# 通过索引级别分组
columns = pd.MultiIndex.from_arrays([['Python', 'Java', 'Python', 'Java', 'Python'],
                                     ['A', 'A', 'B', 'C', 'B']], names=['language', 'index'])
df_obj4 = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
print(df_obj4)

# 根据language进行分组
print(df_obj4.groupby(level='language', axis=1).sum())
# 根据index进行分组
print(df_obj4.groupby(level='index', axis=1).sum())


笔记04 agg()聚合

数据产生标量的过程,如mean(),count()等,常用于对分组后的数据进行计算

一、内置的聚合函数

sum(),mean(),max(),min(),count(),size(),describe()

函数名 说明
count 分组中非NA值的数量
sum 非NA值的和
mean 非NA值的平均值
median 非NA值的算术中位数
std,var 无偏(分母为n-1)标准差和方差
min,max 非NA值的最小值和最大值
prod 非NA值的积
first,last 第一个和最后一个非NA值
print(df_obj5.groupby('key1').sum())
print(df_obj5.groupby('key1').max())
print(df_obj5.groupby('key1').min())
print(df_obj5.groupby('key1').mean())
print(df_obj5.groupby('key1').size())
print(df_obj5.groupby('key1').count())
print(df_obj5.groupby('key1').describe())

二、可自定义函数,传入agg方法中

grouped.agg(func)
func的参数为groupby索引对应的记录

def peak_range(df):
    """
        返回数值范围
    """
    #print type(df) #参数为索引所对应的记录
    return df.max() - df.min()

print(df_obj5.groupby('key1').agg(peak_range))
print(df_obj.groupby('key1').agg(lambda df : df.max() - df.min()))


三、应用多个聚合函数

print(df_obj.groupby('key1').agg(['mean', 'std', 'count', peak_range])) # 默认列名为函数名

print(df_obj.groupby('key1').agg(['mean', 'std', 'count', ('range', peak_range)])) # 通过元组提供新的列名


四、对不同的列分别作用不同的聚合函数,使用dict

# 每列作用不同的聚合函数
dict_mapping = {'data1':'mean',
                'data2':'sum'}
print(df_obj.groupby('key1').agg(dict_mapping))

dict_mapping = {'data1':['mean','max'],
                'data2':'sum'}
print(df_obj.groupby('key1').agg(dict_mapping))


五、分组后修改列名称

dict_obj = {'key1' : ['a', 'b', 'a', 'b', 
                      'a', 'b', 'a', 'a'],
            'key2' : ['one', 'one', 'two', 'three',
                      'two', 'two', 'one', 'three'],
            'data1': np.random.randint(1, 10, 8),
            'data2': np.random.randint(1, 10, 8)}
df_obj = pd.DataFrame(dict_obj)
print(df_obj)

# 按key1分组后,计算data1,data2的统计信息并附加到原始表格中,并添加表头前缀
k1_sum = df_obj.groupby('key1').sum().add_prefix('sum_')
print(k1_sum)


笔记05 补充

一、transform

transform的计算结果和原始数据的形状保持一致,

如:grouped.transform(np.sum).

# 方法2,使用transform
k1_sum_tf = df_obj.groupby('key1').transform(np.sum).add_prefix('sum_')
df_obj[k1_sum_tf.columns] = k1_sum_tf
print(df_obj)

二、merge(持续更新)

k1_sum_merge = pd.merge(df_obj, k1_sum, left_on='key1', right_index=True)
print(k1_sum_merge)

三、apply(待补充)

相关文章

网友评论

      本文标题:机器学习之工程实现一《以房价预测xgboost实现为例的基本工具

      本文链接:https://www.haomeiwen.com/subject/tzswlqtx.html