美文网首页
机器学习之工程实现一《以房价预测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