美文网首页
Titanic baseline总结

Titanic baseline总结

作者: 请不要问我是谁 | 来源:发表于2018-09-04 19:45 被阅读0次

    在此总结编写Titanic baseline程序,包括编写思路与程序实现

    pandas库的使用

    1.设置显示宽度
    pd.set_option('display.max_columns', 500, 'display.width', 1000)
    2.pandas读取csv文件使用函数read_csv(),函数参数较多,往往用一个记一个,在此直接填入要加载哪个文档就好。
    3.读取的csv文件有header的话,pd读取将数据创建为DataFrame,相当于数据库中一张表,比如可进行groupBy操作,然后进行count操作。
    g_SibSp = data_train.groupby(['Parch', 'Survived'])
    df_SibSp = pd.DataFrame(g_SibSp.count()['PassengerId'])
    4.提取数据中某些列
    df[['Age', 'Fare', 'Parch', 'SibSp', 'Pclass']]
    多列要用[]再括起来
    也可使用函数filter,可搭配正则表达式。
    df_test.filter(regex='Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
    也可使用age_df[age_df.Age.notnull()]。这样直接可对选中的列进行操作,比如判断是否为空,不为空notnull(),为空isnull(),比如判断是否等于某个值。
    data_train.Embarked[data_train.Survived == 0].value_counts()
    value_count函数进行计数。
    还可使用loc函数定位,这样可以直接赋值。
    df.loc[(df.Cabin.notnull()), 'Cabin'] = "Yes"
    多个条件筛选时用多个[]
    data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3]
    5.对df数据进行切片时需要将数据转为array。使用函数values。同样要使用矩阵的一些操作,比如reshape也需要转换一下。

    train_np = train_df.values
    # y即Survival结果
    y = train_np[:, 0]
    # x即特征属性
    X = train_np[:, 1:]
    

    6.进行数据连接
    df = pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1) # 表横向连接
    7.删除数据
    df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True) # 去除原来的列
    8.get_dummies函数进行one-hot编码
    dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix='Cabin')
    9.将结果保存为csv文件

    result = pd.DataFrame({'PassengerId': data_test['PassengerId'].values, 'Survived': predictions.astype(np.int32)})
    result.to_csv("logistic_regression_predictions.csv", index=False)   # 保存csv
    

    首先生成DataFrame,然后调用to_csv函数,不需要index。

    matplotlib画图

    1.显示中文字符设置

    mpl.rcParams['font.sans-serif'] = ['SimHei']    # 用来正常显示中文标签
    mpl.rcParams['font.family'] = 'STSong'
    mpl.rcParams['font.size'] = 10
    

    2.画柱状图

    fig = plt.figure()
    fig.set(alpha=0.2)  # 透明度设置
    plt.subplot2grid((2, 3), (0, 0))    # 2*3格,第一张图
    data_train.Survived.value_counts().plot(kind='bar')  # 获救人数柱状图
    plt.title("获救情况(1为获救)")
    plt.ylabel("人数")
    

    subplot2grid用来灵活布局显示多张图片。第四行直接将某一列不同类型计数并画成柱状图,非常的方便。
    3.画散点图

    plt.subplot2grid((2, 3), (0, 2))
    plt.scatter(data_train.Survived, data_train.Age)    # 散点图,横坐标是否存活,纵坐标年龄
    plt.ylabel("年龄")
    plt.grid(b=True, which='major', axis='y')   # b设置网线,which默认'major',绘制y方向的网线
    plt.title("按年龄看获救情况")
    

    使用scatter函数,设置横坐标与纵坐标即可。grid用来设置网格。
    4.密度分布曲线

    plt.subplot2grid((2, 3), (1, 0), colspan=2)     # 横向两格
    # kernel density estimate(核密度估计)
    data_train.Age[data_train.Pclass == 1].plot(kind='kde')
    data_train.Age[data_train.Pclass == 2].plot(kind='kde')
    data_train.Age[data_train.Pclass == 3].plot(kind='kde')
    plt.xlabel("年龄")
    plt.ylabel("密度")
    plt.title("各等级的年龄分布")
    plt.legend(("1等仓", "2等仓", "3等仓"), loc='best')   # loc显示位置,best自适应
    

    只要改变kind值为kde即可。
    5.显示同一x值下不同y值的大小的柱状图,这种柱状图视觉效果明显。

    survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
    survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
    df = pd.DataFrame({"获救": survived_1, "未获救": survived_0})
    df.plot(kind='bar', stacked=True)
    plt.title("各乘客等级的获救情况")
    plt.xlabel("乘客等级")
    plt.ylabel("人数")
    

    步骤是先生成一个DataFrame,然后调用函数df.plot(kind='bar', stacked=True)。
    transpose()函数可进行反转。df = pd.DataFrame({"获救": survived_1, "未获救": survived_0}).transpose()

    6.data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3].value_counts().plot(kind='bar', label='male high class', color='lightblue')
    数据多条筛选与plot多个参数设置。

    sklearn的preprocessing.StandardScaler()使用

    函数目的是将一些变化幅度较大的特征化到[-1,1]之间,这样可以加速logistic regression回归。
    使用分为三步:

    scaler = preprocessing.StandardScaler()
    age_scale_param = scaler.fit(df['Age'].values.reshape(-1, 1))   # 输入时2D的,如果是单一feature要reshape(-1,1),values是转化为array,用来计算数据特征,有时这一步可以省略。
    df['Age_scaled'] = scaler.fit_transform(df['Age'].values.reshape(-1, 1), age_scale_param)  # 关键是这一步,后面一个参数可以没有。
    

    不用每次都创建scaler,创建一次即可。注意点是要进行array转化并reshape(-1, 1),-1是当前不用指定多少行。按要求依次调用fit,fit_trainsform即可。


    fit与fit_transform参数

    当数据量比较大时,比如在训练集中,去除第二步也是可以的,直接使用fit_trainsform。但当数据量不大时,比如在test数据集中,需要第二步产生的平均值,方差参数来对test的数据进行变化。

    利用sklearn.ensemble的RandomForestRegressor进行数据填充

    基本步骤:

    # y目标年龄
        y = know_age[:, 0]
        # X 特征属性
        X = know_age[:, 1:]
        # fit到RandomForestRegressor中
        rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)   # 单独说明
        rfr.fit(X, y)
        # 用得到的模型进行未知年龄结果预测
        predicted_ages = rfr.predict(unknow_age[:, 1::])
        # 用的到的预测结果填充原缺失数据
        df.loc[(df.Age.isnull()), 'Age'] = predicted_ages
    

    先划分目标值y,特征属性X,再生成模型RanddomForestRegressor,其中有较多参数:

    random_state : int, RandomState instance or None, optional (default=None)
    If int, random_state is the seed used by the random number generator; If RandomState instance, random_state is the random number generator; If None, the random number generator is the RandomState instance used by np.random.
    n_estimators : integer, optional (default=10)
    The number of trees in the forest.
    n_jobs : integer, optional (default=1)
    The number of jobs to run in parallel for both fit and predict. If -1, then the number of jobs is set to the number of cores.
    主要用到两个函数fit与predict

    fit函数
    predict函数

    使用sklearn的linear_model进行数据预测

    基本用法:

    # y即Survival结果
    y = train_np[:, 0]
    # x即特征属性
    X = train_np[:, 1:]
    # fit到LogisticRegression中
    clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6)    # 单独分析
    clf.fit(X, y)
    test_df = df_test.filter(regex='Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
    predictions = clf.predict(test_df)
    

    用法基本与RanddomForestRegressor类似,先是目标数据y,特征属性X的划分,调用linear_model.LogisticRegression生成模型,fit函数输入训练数据,predict函数预测数据。
    RandomForestClassifier的用法也是如此,经测试,单模型下LogisticRegression(0.76555)效果比RandomForestClassifier(0.72727)效果好。

    至此,Titanic baseline用到的方法总结完毕,对于随机森林分类,随机森林回归,线性回归模型的原理介绍及参数调优将在以后介绍。

    相关文章

      网友评论

          本文标题:Titanic baseline总结

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