Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Python机器学习及实践——从零开始通往Kaggle竞赛之路

2019/09/15 机器学习 Python
Word count: 1,543 | Reading time: 6min

Python机器学习及实践——从零开始通往Kaggle竞赛之路

监督学习模型

分类

线性模型

Logistic

逻辑回归函数 : $g(z)=\frac {1}{1+_e^{-z}} $

逻辑回归模型hw,b(x)=g(f(w,x,b))=11+ez=11+e(wTx+b)h_{w,b}(x)=g(f(w,x,b)) = \frac{1}{1+e^{-z}} = \frac {1}{1+e^{-(w^{T}x+b)}}

处理缺省值的方法:

1.缺省值较少时直接删除数据

1
2
data = data.replace(to_replace='? ' ,value = np.nan)
data = data.dropna(how='any')
分割数据
1
2
3
from sklearn.cross_validation import train_test_split
X_train , Y_train , X_test , Y_test = train_test_split(data[names[1:10]],data[names[10]],test_size = 0.25,random_state = 33)
# 参数说明 : $1X,$2Y,$3分割规模,$4分割种子
标准化数据

保证每个维度的特征数据方差为1,均值为0,使得预测结果不回被某些维度过大的特征值主导

1
2
3
4
from sklearn.preprocessing import StandardScaler
s = StandardScaler()
X_train = s.fit_transform(X_train)
X_test = s.transform(X_test)
混淆矩阵

🎯逻辑回归对参数的计算采用精确解析的方式,时间长性能高;SGD(随机梯度上升)分类估计模型参数,时间短性能低。数据规模在10W量级时考虑对时间的消耗,更推荐使用随机梯度方法对模型参数进行估计。

📝说明用例:良恶性肿瘤

支持向量机(​​分类)

决定直线位置的并不是所有数据,而是其中 两个空间间隔最小两个不同类别 的数据点,把着中国真正帮助决策最有线性分类模型的数据点叫做“支持向量” 。同时要指出的是,logistic模型考虑了所有数据样本对参数的影响,所以不一定能获得最佳的分类器。

多分类的SVM

将其中一类看作是阳性(正)样本,其余的全看成负样本。如有10个类别,则创造10个二分类任务。

🎯SVM具有精妙的模型假设,可以在高维度的数据中筛选对预测任务有效的少数训练样本,不仅节省模型学习需要的数据内存,还提高了模型的预测性能,但是同时是以CPU资源和计算时间为代价的。

📝手写体数据​: 需要知道的是,经典模型没有对结构性信息学习的能力,所以这边对图片的处理其实是将2D图片像素矩阵(scikit-learn数据集里的是8*8)逐行首尾拼接为1D的像素特征向量。

非线性模型

朴素贝叶斯

单独考量每一个维度特征被分类的条件概论,进而综合这些概率并对其所在的特征向量做出分类预测。

数学假设:各个维度上的特征被分类的条件概率之间是相互独立的。

🎯具有较强的特征条件独立假设,使得模型预测所需要估计的参数规模从幂指数量级向线性量级减少,极大​节约了内存消耗和计算时间。但也受限与这种强假设的限制,训练时无法将各个特征之间的联系考量在内,使得该模型再其他数据特征关联性较强的分类任务上的性能表现不佳。

📝文本分类:互联网新闻分类、垃圾邮件筛选

K近邻(KNN)

设有一个测试样本点,以及已经分好类(带有标签)的训练样本。那么该样本点的类别判定会根据在特征空间中最近的K个已标记样本作为参考。因此模型的性能很大程度上取决于K值的设定,但是K值不属于训练数据后学习的参数,而是模型初始化时需要提前确定的。

🎯是无参数模型中最简单的一种,由于需要对预先加载在内存的训练样本进行遍历,逐一计算相似度、排序且选择K个最近邻训练样本的标记。所以是O(N2)的算法复杂度,一旦数据量大,可能会花费更多的时间(另一种理解为空间换时间,可探讨)

📝 iris鸢尾花数据集​ : ▲在对数据进行分割时请保证随机取样!
由于scikit-learn获得的Iris数据集是根据类别依次排列的,所以如果只采样前25%那么所有采样的样本都是同一个类别,同时由于训练样本是不平衡的(Unbalanced),这样取得的结果存在偏差,且可信度低。因此随机采样train_test_split(data[names[1:10]],data[names[10]],test_size = 0.25,random_state = 33)设置随机种子是必要的。

决策树

每个节点可以看作是二分类任务,根据不同特征组合搭建多层决策树,在学习时需要考虑特征节点的选择顺序。(度量方式:信息熵、基尼不纯性)

数据处理
缺省值:
1
2
3
4
X = titannic[['pclass','age','sex']]
...
# 补充age里的数据,使用平均数或者中位数都是对模型偏离成都造成最小影响的策略
X['age'].fillna(X['age'].mean(),inplace = True)
特征值转换

类别性特征值转换为数值特征,用0/1代替

1
2
3
4
5
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse = False)
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
print(vec.feature_names)
>>> ['age','plcass=1st','pclass=2nd', 'sex=female','sex=male']

🎯决策树在模型描述上有巨大的优势,推断逻辑非常直观,有清晰的可解释性,也方便模型的可视化。同时这些特性也保证了使用决策树时,无需考虑对数据量化甚至标准化。决策树属于有参数模型,需要花费更多时间在训练数据上面

📝泰坦尼克号沉船事故

回归

线性回归器

🎯美国波士顿地区房价

KNN

支持向量机

回归树

集成模型

无监督学习模型

数据聚类

K均值(K-means)

特征降维

主成分分析(PCA)

Author: Mrli

Link: https://nymrli.top/2019/05/27/Python机器学习及实践——从零开始通往Kaggle竞赛之路/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
Keras使用——图像增强
NextPost >
ACM-强连通分量
CATALOG
  1. 1. Python机器学习及实践——从零开始通往Kaggle竞赛之路
  2. 2. 监督学习模型
    1. 2.1. 分类
      1. 2.1.1. 线性模型
        1. 2.1.1.1. Logistic
          1. 2.1.1.1.1. 处理缺省值的方法:
          2. 2.1.1.1.2. 分割数据
          3. 2.1.1.1.3. 标准化数据
          4. 2.1.1.1.4. 混淆矩阵
        2. 2.1.1.2. 支持向量机(​​分类)
          1. 2.1.1.2.1. 多分类的SVM
      2. 2.1.2. 非线性模型
        1. 2.1.2.1. 朴素贝叶斯
        2. 2.1.2.2. K近邻(KNN)
        3. 2.1.2.3. 决策树
          1. 2.1.2.3.1. 数据处理
            1. 2.1.2.3.1.1. 缺省值:
            2. 2.1.2.3.1.2. 特征值转换
    2. 2.2. 回归
      1. 2.2.1. 线性回归器
      2. 2.2.2. KNN
      3. 2.2.3. 支持向量机
      4. 2.2.4. 回归树
      5. 2.2.5. 集成模型
  3. 3. 无监督学习模型
    1. 3.1. 数据聚类
      1. 3.1.1. K均值(K-means)
    2. 3.2. 特征降维
      1. 3.2.1. 主成分分析(PCA)