python 逻辑回归 复杂抽样_掌握python机器学习-读书笔记7 - (抽样分类方法)

11.1 算法抽查

在实践之前你并不知道哪种算法对你的的数据效果最好。 你需要尝试用不同的算法去实践, 然后知道下一步的方向。 这就是我说的算法抽查。

11.2 算法概述

两种线性算法

逻辑回归

线性判别分析

非线性机器学习算法

K近邻算法

朴素贝叶斯。

分类和回归树 - CART 是决策树的一种

支持向量机

11.3 线性机器学习算法

有个问题, 什么叫线性, 什么叫非线性?

其实一般的书里面, 并不是这么分类的。 这里可能为了突出线性的重要性。 算法分为线性和非线性。 线性呢, 比如逻辑回归, LDA。

11.3.1 逻辑回归

名字里是回归, 其实是一种分类方法。

逻辑回归是一般的线性回归加了一个sigmoid函数, 于是取值从整个实数域到了-1 到 +1, 于是二分类就很容易理解了, 大于零一种, 小于零一种。

逻辑回归要求

假设高斯分布

数字的输入变量

二分类问题:

如果有时间, 应该把重要的机器学习方法再回顾一遍。 主要思想, 实例。 后面可以搞个单独的系列

# Logistic Regression Classification

from pandas import read_csv

from sklearn.model_selection import KFold

from sklearn.model_selection import cross_val_score

from sklearn.linear_model import LogisticRegression

filename = 'pima-indians-diabetes.data.csv'

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

dataframe = read_csv(filename, names=names)

array = dataframe.values

X = array[:,0:8]

Y = array[:,8]

num_folds = 10

kfold = KFold(n_splits=10, random_state=7)

model = LogisticRegression()

results = cross_val_score(model, X, Y, cv=kfold)

print(results.mean())

# 0.76951469583

11.3.2 线性回归分析

LDA 是一种统计技术对于二分类和多分类问题。

它也假设参数是高斯分布

# LDA Classification

from pandas import read_csv

from sklearn.model_selection import KFold

from sklearn.model_selection import cross_val_score

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

filename = 'pima-indians-diabetes.data.csv'

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

dataframe = read_csv(filename, names=names)

array = dataframe.values

X = array[:,0:8]

Y = array[:,8]

num_folds = 10

kfold = KFold(n_splits=10, random_state=7)

model = LinearDiscriminantAnalysis()

results = cross_val_score(model, X, Y, cv=kfold)

print(results.mean())

# 0.773462064252

可以看到其实scikit learn 给我们做了很多的封装, 调用过程都是一样的, 没有难度。 最简单的就可以调用然后看效果。

11.4 非线性算法

11.4.1 k比邻

k比邻 是一种基于距离的度量。 找到k个最近的样本对一个新的样本, 然后取得平均值作为预测值。 这里k 的取得就可能有不同的效果。

如下

# KNN Classification

from pandas import read_csv

from sklearn.model_selection import KFold

from sklearn.model_selection import cross_val_score

from sklearn.neighbors import KNeighborsClassifier

filename = 'pima-indians-diabetes.data.csv'

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

dataframe = read_csv(filename, names=names)

array = dataframe.values

X = array[:,0:8]

Y = array[:,8]

num_folds = 10

kfold = KFold(n_splits=10, random_state=7)

model = KNeighborsClassifier()

results = cross_val_score(model, X, Y, cv=kfold)

print(results.mean())

# 0.726555023923

首先 1) 没有说明k 是多少, 应该有一个默认值, 找api应该可以看到。

2) k比邻应该是很耗时的, 但是今天的实践没有反应, 原因应该是样本过少。

11.4.2 朴素贝叶斯

朴素贝叶斯是基于贝叶斯理论的一种算法。 它有一个重要的假设, 就是每个变量是独立分布的, 就是没有关联。 朴素贝叶斯计算每种参数的可能性以及每个类别的条件概率, 然后来估计新的数据并综合计算。 这样得到了新样本的估计。

假设也是高斯分布, 就可以用高斯分布的密度函数

突然想到, 在实践中, 是可以PCA 来得到彼此正交的参数, 然后来用朴素贝叶斯是否效果更好??

# Gaussian Naive Bayes Classification

from pandas import read_csv

from sklearn.model_selection import KFold

from sklearn.model_selection import cross_val_score

from sklearn.naive_bayes import GaussianNB

filename = 'pima-indians-diabetes.data.csv'

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

dataframe = read_csv(filename, names=names)

array = dataframe.values

X = array[:,0:8]

Y = array[:,8]

kfold = KFold(n_splits=10, random_state=7)

model = GaussianNB()

results = cross_val_score(model, X, Y, cv=kfold)

print(results.mean())

# 0.75517771702

11.4.3 CART

决策树有几种, 比如 CART, C4.5

决策树呢基本的想法是遍历所有特征, 对第一个特征做分类, 然后在每个分支根据第二个分类, 继续。 知道所有的样本分类相同, 或者特征用完了。

这里有个问题, 如何选择第一个分类,有gini法, 最大熵等几种办法,选择合适的特征顺序, 构建的决策树效率更高。

它的缺点, 然后对于离异点会非常敏感, 这个要小心。

当然, 后期的随机森林, 以及boosting 等做法很多基于决策树来做, 而且起到了很好的分类效果, 这是后话。

# CART Classification

from pandas import read_csv

from sklearn.model_selection import KFold

from sklearn.model_selection import cross_val_score

from sklearn.tree import DecisionTreeClassifier

filename = 'pima-indians-diabetes.data.csv'

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

dataframe = read_csv(filename, names=names)

array = dataframe.values

X = array[:,0:8]

Y = array[:,8]

kfold = KFold(n_splits=10, random_state=7)

model = DecisionTreeClassifier()

results = cross_val_score(model, X, Y, cv=kfold)

print(results.mean())

# 0.697795625427

11.4.4 支持向量机

支撑向量机, 我感觉这是基本机器学习算法中最复杂的一个。

它的主要思想呢, 就是找到一个切平面可以来区分不同的类别。 - 其实就是二分类。

那么问题来了, 如果平面不能分开呢, 可以引申到多个维度

还有维度如果过高呢, 这里就是核函数的用武之地了。 它可以来解决维度过高的问题, 过高的维度, 甚至无限维对计算是不利的。

在上面这个思想下, SVM 是为了找到距离两边的样本最远的线, 或者平面。

对于奇异点, 它又增加了一个c, 作为容错。

对于SVM, 基本思路可能不复杂, 但是推导过程还是不简单的。 详情见jly的博客, 当然它是基于几个牛人的理解。 后面有机会也可以写以下。

然后对于实践而言, 有几个点

核函数的选择。 高斯, 还是别的

几个参数的调优。 这个后面也应该又讨论。

# SVM Classification

from pandas import read_csv

from sklearn.model_selection import KFold

from sklearn.model_selection import cross_val_score

from sklearn.svm import SVC

filename = 'pima-indians-diabetes.data.csv'

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

dataframe = read_csv(filename, names=names)

array = dataframe.values

X = array[:,0:8]

Y = array[:,8]

kfold = KFold(n_splits=10, random_state=7)

model = SVC()

results = cross_val_score(model, X, Y, cv=kfold)

print(results.mean())

## 0.651025290499

11.5 小结

本章学习如何用几种分类算法做抽样。 下一章是关于回归的。

cha 13 如何选择好的算法

13.1 选择算法

这个很容易理解, 拿出来结果比较以下即可。 看代码

# Compare Algorithms

from pandas import read_csv

from matplotlib import pyplot

from sklearn.model_selection import KFold

from sklearn.model_selection import cross_val_score

from sklearn.linear_model import LogisticRegression

from sklearn.tree import DecisionTreeClassifier

from sklearn.neighbors import KNeighborsClassifier

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

from sklearn.naive_bayes import GaussianNB

from sklearn.svm import SVC

# load dataset

filename = 'pima-indians-diabetes.data.csv'

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

dataframe = read_csv(filename, names=names)

array = dataframe.values

X = array[:,0:8]

Y = array[:,8]

# prepare models

models = []

models.append(('LR', LogisticRegression()))

models.append(('LDA', LinearDiscriminantAnalysis()))

models.append(('KNN', KNeighborsClassifier()))

models.append(('CART', DecisionTreeClassifier()))

models.append(('NB', GaussianNB()))

models.append(('SVM', SVC()))

# evaluate each model in turn

results = []

names = []

scoring = 'accuracy'

for name, model in models:

kfold = KFold(n_splits=10, random_state=7)

cv_results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)

results.append(cv_results)

names.append(name)

msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())

print(msg)

# boxplot algorithm comparison

fig = pyplot.figure()

fig.suptitle('Algorithm Comparison')

ax = fig.add_subplot(111)

pyplot.boxplot(results)

ax.set_xticklabels(names)

pyplot.show()

result

LR: 0.769515 (0.048411)

LDA: 0.773462 (0.051592)

KNN: 0.726555 (0.061821)

CART: 0.691302 (0.069249)

NB: 0.755178 (0.042766)

SVM: 0.651025 (0.072141)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值