kaggle泰坦尼克号之灾学习笔记

引言

一开始学习这篇文章([(http://blog.csdn.net/han_xiaoyang/article/details/49797143)])的时候觉得真的是什么都不懂啊,后来老师又讲解了一下,觉得貌似懂了那么一丢丢。

画图,可视化:

简单来说就是把各个属性综合在一起,看作是一个x向量,x=(x1,x2,x3,……xn),其中的x1,x2,……表示各个属性,Y={0,1},表示Y的取值,Y=f(x)表示Y与属性之间的关系,找f的关系

数据清洗:

数据缺失处理
归一化:把不同的数值都放到同一个区间中,减小数据的影响

线性回归:

一次方程:一条直线
二次方程:一条曲线……
生成一条线,建立一个普通的模型,一点一点的试

欠拟合与过拟合:

分成 测试数据集 与 训练数据集
有时候没有测试数据集就可以使用交叉验证、

模型融合:

随机取多个数据集,建立不同的模型,用一个数据在着不同的多个模型
中进行判断,逻辑回归模型与最小二乘算法

经过对文章的认识下面是我的看法或者笔记

第一步:

认识数据

第二步:

对不同的属性进行分析,找不同属性与生存概率之间的关系

第三步:

简单数据预处理

  • cabin和age有数据丢失。常见处理方式:
    • 占比极高:直接舍弃;
    • 缺值适中,且为非连续值特征属性:作为新的类加到类别特征中;
    • 缺值适中,且为连续值特征属性:给定一个步长,离散化,作为一个类别加入到特征中;
    • 缺值个数不是很多:尝试自己拟合,补充数据

第四步:

test.csv也要做和train一样的预处理

  • 基本步骤与对train的预处理类似:
    • 先进行特征变换
    • 用RandomForestRegressor模型填上丢失的年龄
    • 进行属性展开
    • 把数据进行按比例缩放规范化
    • 逻辑回归

第五步:

  • 分析是过拟合还是欠拟合,以确定我们需要更多的特征还是更多数据,或者其他操作
  • 建立learning curves、对数据进行观察分析,看不同属性对于获救概率的影响

第六步:

  • 交叉验证:train.csv分成两部分,
    • 一部分用于训练我们需要的模型
    • 另外一部分数据看我们预测算法的效果。
    • 先把交叉验证里面的bad case拿出来看看,看看人眼审核,是否能发现什么蛛丝马迹,是我们忽略了哪些信息,使得这些乘客被判定错了.再把bad case上得到的想法和前头系数分析的合在一起,然后逐个试试。
  • “train_df” 和 “vc_df” 两个数据部分
    • 前者用于训练model
    • 后者用于评定和选择模型以样本数为横坐标
    • 训练和交叉验证集上的错误率作为纵坐标

第七步:

  • 模型融合
    • 最简单的模型融合大概就是这么个意思,比如分类问题,当我们手头上有一堆在同一份数据集上训练得到的分类器(比如logistic regression,SVM,KNN,random forest,神经网络),那我们让他们都分别去做判定,然后对结果做投票统计,取票数最多的结果为最后结果。

模型融合的作用

  • 模型融合可以比较好地缓解,训练过程中产生的过拟合问题, 从而对于结果的准确度提升有一定的帮助。
  • 不要用全部的训练集,每次取训练集的一个subset,做训练,这样,我们虽然用的是同一个机器学习算法,但是得到的模型却是不一样的;同时,因为我们没有任何一份子数据集是全的,因此即使出现过拟合,也是在子训练集上出现过拟合,而不是全体数据上,这样做一个融合,可能对最后的结果有一定的帮助。这就是常用的Bagging。

还应思考的问题

  • 过拟合与欠拟合的原因及如何避免
  • 线性回归的原理 与最小二乘法的

用到的知识点

  • pandas把CSV文件读入成dataframe格式

  • data_train.info() 的作用总结每种属性有多少个乘客有记录

  • matplotlib.plt.plot()作用是画图,画的图是通过散点描述的,如果散点足够多,那么最后画出来且用-连接的话,点与点直接非常拥挤,看起来就像函数曲线;如果点不是太多,用-连起来就是折线图;这两个都是连续的绘制。但是无论点是多还是少,如果不采用-连接,画出来的图就是离散的,所以一定要注意plot函数可以画连续(函数、折线)也可以离散

  • .plt.figure()—在plt中绘制一张图片

    • figure语法说明
      • figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
      • num:图像编号或名称,数字为编号 ,字符串为名称
      • figsize:指定figure的宽和高,单位为英寸;
      • dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
      • 1英寸等于2.5cm,A4纸是 21*30cm的纸张
      • facecolor:背景颜色
      • edgecolor:边框颜色
      • frameon:是否显示边框
  • subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)

    • shape:放置子图的网格规格,包含两个整型的元组,第一个代表网格的行数,第二个代表网格的列数。
    • loc:子图所在的位置,包含两个整型的元组,第一个代表子图所在的行数,第二个代表子图所在的列数。
    • rowspan:整型,向下跨越的行数,默认为1。
    • colspan:整型,向下跨越的列数,默认为1。
    • fig:放置子图的图像,默认为当前图像。
    • **kwargs:附加的传递给add_subplot的关键字参数。
  • plt.scatter() 散点图

    • plt.scatter(x,y,s=20,c = None,marker = ‘o’,cmap = none,norm = none, vmin = none,vmax = none,alpha = none,linewidths = none,verts = none,edgecolors = none,hold = none,**kwargs)
    • s:散点的大小
    • c:散点的颜色,'r '/‘g’/‘y’/‘w’/‘k’…
    • marker:散点形状, ‘.’(点)/‘o’(圆)/‘v’(倒三角形)/’*’(星星)/‘s’(正方形)…
    • cmap:colormap,颜色版:‘accent’,‘blues’,‘bugn’,‘oranges’…
    • vmin,vmax:亮度设置,标亮
    • alpha :颜色透明程度, 实数,0-1之间
    • linewidths:线的宽度
    • linestyle: 线的风格,’–’(虚线)/ ‘-’ (直线) / ‘-.’(间隔虚线)/ ': '(全为点)…
  • plt.plot()函数用于对图形进行一些更改。

    • plt.plot(x, y, format_string, **kwargs)
    • x:x轴数据,列表或数组,可选
    • y:y轴数据,列表或数组
    • format_string:控制曲线的格式字符串,可选由颜色字符、风格字符和标记字符组成。
    • bar为柱状图
  • plt.grid() # 显示网格线 1=True=默认显示;0=False=不显示

  • plt.grid(1) # 显示网格线

  • plt.grid(True) # 显示网格线

  • plt.grid(b=True) # 显示网格线

  • plt.grid(b=1) # 显示网格线

  • plt.grid(b=True, axis=‘x’) #只显示x轴网格线

  • plt.grid(b=True, axis=‘y’) #只显示y轴网格线

  • plt.grid(b=1, which=‘major’) # 默认就是major,例如x轴最大值为3.5(这个值占比极小,不影响作图的话),这部分图像不会显示;若which='both’则显示;若设置为minor则不显示网格;which一共3个参数[‘major’ , ‘minor’,‘both’] 默认是major表示主刻度,后面分布为次刻度及主次刻度都显示。

  • Series.plot方法的函数:
    参数说明

    • label 用于图例的标签
    • ax 要在其上进行绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot
    • style 将要传给matplotlib的风格字符串(for example: ‘ko–’)
    • alpha 图表的填充不透明(0-1)
    • kind 可以是’line’, ‘bar’(柱状图), ‘barh’, ‘kde’
    • 直方图:是一种可以对值频率离散化显示的柱状图。通过调用Series.hist()方法即可创建。
    • 密度图:与直方图相关的一种类型图是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的,通过给plot传入参kind = ‘kde’ 即可。
    • 散布图:是观测两个一维数据序列之间关系的有效手段,使用pd.scatter_matrix()即可建立。
    • logy 在Y轴上使用对数标尺
    • use_index 将对象的索引用作刻度标签
    • rot 旋转刻度标签(0-360)
    • xticks 用作X轴刻度的值
    • yticks 用作Y轴刻度的值
    • xlim X轴的界限
    • ylim Y轴的界限
    • grid 显示轴网格线
    • legend:插图说明
    • plt.show() #显示图片
  • 折线图:plot

  • 柱形图:plot(kind=‘bar’)

  • 纵向柱形图:plot.bar()

  • 横向柱形图:plot.barh()

  • 堆积柱形图:plot.bar(stacked=True)

  • 直方图:plot.hist()

  • 透明度:alpha=0.5

  • 堆积函数:stacked=True/False

  • 箱线图:plot.box()

  • 一般箱线图的画法:df.boxpolt(column=’’,by=’’)

  • 密度图:plot.kde()

  • 面积图:plot.area()

  • 散点图:plot.scatter(x=’’,y=’’)

  • 需要两个数值x,y

  • 散点图矩阵:plot.plotting.scatter_matrix()

  • 传入数据框,传入我们想要的数值

  • 饼图:plot.pie()

  • figsize=(6,6)让饼图变圆

  • 反堆叠形式:unstack().T 可转置

  • pandas.DataFrame 官方文档

  • class pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
    参数意义数据结构

    • data 需要被转换的数据 ndarray (structured or homogeneous), Iterable, dict, or DataFrame
    • index 设置行索引 Index or array-like
    • columns 设置列名 Index or array-like
    • dtype 设置数据类型 dtype, default None
    • copy 备份数据 boolean, default False
    • dtype = float意味着,把data数据中能转化为float的全部转化成float,不能转换的保持原来状态。
  • plot是绘图,subplot是子图,整体不偏离这个框架。

  • fig.add_subplot(111) 此处,fig= plt.figure()是一个对象。

    • 其中参数111,指的是将图像分成1行1列,此子图占据从左到右从上到下的1位置。
    • plt.subplot(234) 将画布分成2行3列,取从左到右,从上到下第4个位置。
      • 两者本质是一样的,不同在于add_subplot是面向对象,subplot是面向函数
  • 保证子图中坐标范围一致

    • 使某个figure中的所有子图共享一个坐标轴的方法:加sharey前一个坐标轴
    • ax1=plt.subplots(1,2,1)
    • ax2=plt.subplots(1,2,2,sharey=ax1)
  • 绘制多个图

    • fig, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = plt.subplots(2, 3sharex=True, sharey=True)ax5.plot(exponential_data, ‘-’)
    • #sharex和sharey都是TRUE代表坐标轴都一样
  • 用scikit-learn中的RandomForest来拟合一下缺失的年龄数据

    • 注:RandomForest是一个用在原始数据中做不同采样,建立多颗DecisionTree,再进行average等等来降低过拟合现象,提高结果的机器学习算法
  • 逻辑回归建模时,需要输入的特征都是数值型特征,我们通常会先对类目型的特征因子化。如cabin原本只是一个属性,但是有两种不同的取值,可以平展开成两种属性。就是添加原来数据中没有的变量,但是这并不是意味着可以随意添加,应该是根据原来的数据进行转换。

    • 例如:将一个变量Embarked,根据它的值(C、Q、S)转换为Embarked_C、Embarked_Q、Embarked_S三个变量(转后有默认名,也可以利用prefix来自己修改)会根据变量的值的唯一值进行转化,有多少唯一值就转化成多少变量,总的来说我的理解就是添加变量,而且添加的变量是原来的那个变量的值得扩展
  • Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素之间关系的一种多变量分析方法。通常的问题是,研究某些因素条件下某个结果是否发生,比如医学中根据病人的一些症状来判断它是否患有某种病。

  • 梯度下降法(求局部极小值):如何应对其局部最小的问题:

    • 1、 以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数;这就是从多个不同的初始点开始搜索寻优,这样陷入不同的局部极小值,从而选取更可能接近全局最小的解;
    • 2、 使用模拟退火:以一定的概率接受比当前解更差的结果,每步迭代中,接受次优解的概率要随着时间推移降低,保证算法能够收敛;
    • 3、 使用随机梯度下降,这样计算出的梯度仍可能不为0,这样就可能跳出局部极小值。
  • Scikit-learn Preprocessing: 标准化、去均值、方差缩放通过将属性值按比例缩放,使之落入一个小的特定区间,如0.0~1.0,对属性规范化。有很多数据规范化的方法,这里我们将介绍三种:

    • 最小–最大规范化,z-score规范化,按小数定标规范化和最大绝对值缩放。
      • (1)最小–最大规范化
        最小–最大规范化对原始数据进行线性变换。假定minA和maxA分别是属性A的最小值
        和最大值。最小–最大规范化通过计算: v’ = (v - min) /(max - min )* (new_max - new_min) + new_min 这样可以将A的值映射到区间[new_min , new_max]中的v’。
      • (2)z-score规范化
        又称为零均值 规范化,将属性A的值基于均值和方差规范化,在不知道属性A的最小值和最大值的时候,或者是离群值左右了最小–最大规范化时,该方法是有用的。 v’ = v - mean / std
      • (3)按小数定标规范化
        通过移动属性A的小数点位置进行规范化,小数点的移动位数依赖于A的最大绝对值,由下式计算:v’ = v / 10^j 其中j是使得Max(| v’ |) <1的最小整数。例如:假定属性A的取值范围是-986 ~ 917。A的最大绝对值为986.使用小数定标规范化,用1000(即j = 3)除每个数,这样,-986就会被规范化为-0.986,而917也会被规范化成-0.917.
      • (4)最大绝对值缩放
        它只通过除以每个特征的最大值将训练数据特征缩放至 [-1, 1]。这就意味着,训练数据应该是已经零中心化或者是稀疏数据。
  • sklearn.linear_model.LogisticRegression()函数全称是Logistic回归(aka logit,MaxEnt)分类器。

    tol=0.0001, C=1.0, fit_intercept=True, 
    intercept_scaling=1, class_weight=None, random_state=None, 
    solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, 
    warm_start=False, n_jobs=None, l1_ratio=None)``
    
    
  • penalty:惩罚项,str类型,可选参数为l1和l2,默认为l2。用于指定惩罚项中使用的规范。newton-cg、sag和lbfgs求解算法只支持L2规范。L1G规范假设的是模型的参数满足拉普拉斯分布,L2假设的模型参数满足高斯分布,所谓的范式就是加上对参数的约束,使得模型更不会过拟合(overfit),但是如果要说是不是加了约束就会好,这个没有人能回答,只能说,加约束的情况下,理论上应该可以获得泛化能力更强的结果。

  • dual:对偶或原始方法,bool类型,默认为False。对偶方法只用在求解线性多核(liblinear)的L2惩罚项上。当样本数量>样本特征的时候,dual通常设置为False。

  • tol:停止求解的标准,float类型,默认为1e-4。就是求解到多少的时候,停止,认为已经求出最优解。

  • c:正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。

  • fit_intercept:是否存在截距或偏差,bool类型,默认为True。

  • intercept_scaling:仅在正则化项为”liblinear”,且fit_intercept设置为True时有用。float类型,默认为1。

  • class_weight:用于标示分类模型中各种类型的权重,可以是一个字典或者balanced字符串,默认为不输入,也就是不考虑权重,即为None。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者自己输入各个类型的权重。举个例子,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9,1:0.1},这样类型0的权重为90%,而类型1的权重为10%。如class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:

    • n_samples / (n_classes * np.bincount(y))。n_samples为样本数,
    • n_classes为类别数量,np.bincount(y)会输出每个类的样本数,
    • 例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]。
  • 那么class_weight有什么作用呢? 在分类模型中,我们经常会遇到两类问题:

    • 第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。
    • 第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。
    • 这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。提高了某种分类
      的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上
      面两类问题。
  • random_state:随机数种子,int类型,可选参数,默认为无,仅在正则化优化算法为sag,liblinear时有用。

  • solver:优化算法选择参数,只有五个可选参数,即newton-cg,lbfgs,liblinear,sag,saga。

    • 默认为liblinear。solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择,分别是:
      • liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
      • lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
      • newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代 优化损失函数。
      • sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
      • saga:线性收敛的随机优化算法的的变重。
  • max_iter:算法收敛最大迭代次数,int类型,默认为10。仅在正则化优化算法为newton-cg, sag和lbfgs才有用,算法收敛的最大迭代次数。

  • multi_class:分类方式选择参数,str类型,可选参数为ovr和multinomial,默认为ovr 。ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的 many-vs-many(MvM)。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。

  • OvR和MvM有什么不同?

    • OvR的思想很简单,无论你是多少元逻辑回归,都可以看做二元逻辑回归。
      具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。
    • 而MvM则相对复杂,这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类。
    • 可以看出OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本
      分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。如果选择了
      ovr,则4种损失函数的优化方法liblinear,newton-cg,lbfgs和sag都可以选择。但是如
      果选择了multinomial,则只能选择newton-cg, lbfgs和sag了。
  • verbose:日志冗长度,int类型。默认为0。就是不输出训练过程,1的时候偶尔输出结果,大于1,对于每个子模型都输出。

  • warm_start:热启动参数,bool类型。默认为False。如果为True,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。

  • n_jobs:并行数。int类型,默认为1。1的时候,用CPU的一个内核运行程序,2的时候,
    用CPU的2个内核运行程序。为-1的时候,用所有CPU的内核运行程序

  • Bagging(bootstrap aggregatin的缩写)的方法,Bagging是属于机器学习中模型融合的一种方法。大家都知道,决策树是一个可读性很强、分类快,同时不需要对数据进行归一化还有缩放的处理。但是决策树有个不足的地方就是非常容易过拟合,所以必须要采取一些方法进行剪枝。而bagging方法的出现,可以完美地解决了决策树过拟合的问题,同时bagging的使用也会使分类器分类效果得到了显著的提高。

    • 1.base_estimator :基本的估计器,就是你要用到的算法,如果该参数没有赋值,默认为决策树。这个信息告诉我bagging,不仅可以用在决策树上,还可以用于其他的算法模型上。
    • 2.n_estimators:基本估计器的个数,就是你要产生多少个子模型,用在决策树时,即表示产生多少条决策树用来融合。
    • 3.max_samples :从X(训练集)中选取用于训练的样本数,默认为1.0,此处有点疑问。这个1.0是抽取一条样本还是比例为1的样本树?文档说max_samples的值取int 型时为抽取样本的数目,取float型时为 max_samples的值乘以样本的总数,我想问的是:假设max_samples=0.3,是抽取30%的样本吗?那万一取1.3呢?
学习感想

刚开始学习这类的东西,接触起来有点困难,很多的地方都不是很懂,这是自己学习时候留下的笔记,记录一下,希望自己以后可以越学越好吧!^_ ^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

safina ~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值