背景介绍 :
? 可穿戴式设备的流行。让我们能够更便利地使用传感器获取人体的各项数据, 甚至生理数据。
? 当传感器採集到大量数据后。我们就能够通过对数据进行分析和建模。通过 各项特征的数值进行用户状态的推断。依据用户所处的状态提供给用户更加 精准、便利的服务。
数据介绍:
? 我们如今收集了来自 A, B, C, D, E 5 位用户的可穿戴设备上的传感器数据, 每位用户的数据集包括一个特征文件 (a.feature) 和一个标签文件 (a.label)。
? 特征文件里每一行相应一个时刻的全部传感器数值。标签文件里每行记录了 和特征文件里相应时刻的标记过的用户姿态。两个文件的行数同样。同样行 之间互相相应。
任务介绍
? 假设如今出现了一个新用户。但我们仅仅有传感器採集的数据。那么该怎样得到 这个新用户的姿态呢?
? 又或者对同一用户假设传感器採集了新的数据。怎么样依据新的数据推断当前 用户处于什么样的姿态呢?
在明白这是一个分类问题的情况下,我们能够选定某种分类模型(或者说是
算法),通过使用训练数据进行模型学习。然后对每一个測试样本给出相应的分类
结果。
机器学习的分类算法众多,在接下来的学习中我们将会具体介绍经典的分类 算法,如K近邻、决策树和朴素贝叶斯的原理和实现。
基本分类模型:
K近邻分类器(KNN)
KNN:通过计算待分类数据点。与 已有数据集中的全部数据点的距离。
取 距离最小的前K个点,依据“少数服从 多数“的原则,将这个数据点划分为出 现次数最多的那个类别。
sklearn 中的 K 近邻分类器
在 sklearn 库中,能够使用 sklearn.neighbors.KNeighborsClassifier 创建一个 K 近邻分类器,主要參数有:
? n_neighbors : 用于指定分类器中K的大小(默认值为 5,注意与 kmeans 的差别)
? weights : 设置选中的K个点对分类结果影响的权重( 默认值为平均 权重 “uniform”,能够选择 “distance” 代表越近的点权重越高, 或者传入自己编写的以距离为參数的权重计算函数 )
? algorithm : 设置用于计算临近点的方法,由于当数据量非常大的情况
下计算当前点和全部点的距离再选出近期的k各点,这个计算量是非常 费时的。所以(选项中有 ball_tree、kd_tree 和 brute,分别代表不 同的寻找邻居的优化算法,默认值为 auto,依据训练数据自己主动选择)
KNN的使用经验
在实际使用时,我们能够使用全部训练数据构成特征 X 和标签 y,使用 fit() 函数进行训练。在正式分类时。通过一次性构造測试集或者一个一个输入 样本的方式,得到样本相应的分类结果。有关 K 的取值:
? 假设较大。相当于使用较大邻域中的训练实例进行预測。能够减小预计误差,
可是距离较远的样本也会对预測起作用,导致预測错误。
? 相反地,假设 K 较小,相当于使用较小的邻域进行预測,假设邻居恰好是噪
? 普通情况下。K 会倾向选取较小的值,并使用交叉验证法选取最优 K 值。
决策树
决策树是一种树形结构的分类器,通过顺序询问分类点的属性决定分类点终于的类别。通常依据特征的信息增益或其它指标,构建一颗决策树。在分类时,仅仅须要依照决策树中的结点依次进行推断,就可以得到样本所属类别。
比如。依据下图这个构造好的分类决策树, 一个无房产。单身。年收入 55K 的人的会被归入无法偿还信用卡这个类别。
sklearn 中的决策树
在 sklearn 库中,能够使用 sklearn.tree.DecisionTreeClassifier 创建一个决策树用于分类,其主要參数有:
? criterion : 用于选择属性的准则。能够传入 “gini” 代表基尼 系数,或者 “entropy” 代表信息增益。
? max_features : 表示在决策树结点进行分裂时,从多少个特征 中选择最优特征。能够设定固定数目、百分比或其它标准。
它 的默认值是使用全部特征个数。
? 决策树本质上是寻找一种对特征空间上的划分,旨在构建一个训练数据拟合的 好,而且复杂度小的决策树。
? 在实际使用中,须要依据数据情况,调整 DecisionTreeClassifier 类中传入的 參数。比方选择合适的 criterion,设置随机变量等。
朴素贝叶斯
朴素贝叶斯分类器是一个以贝叶斯定理为基础的多分类的分类器。
对于给定数据。首先基于特征的条件独立性假设,学习输入输出的联合概率分布,然后基于此模型,对给定的输入 x。利用贝叶斯定理求出后验概率最大的输出 y。
sklearn 中的朴素贝叶斯
在 sklearn 库中,能够使用 sklearn.naive_bayes.GaussianNB 创建一个高斯朴素贝叶斯分类器,其參数有:
? priors : 给定各个类别的先验概率。假设为空,则按训练数据的实际情况 进行统计; 假设给定先验概率,则在训练过程中不能更改。
朴素贝叶斯是典型的生成学习方法,由训练数据学习联合概率分布,并求得
后验概率分布。
朴素贝叶斯一般在小规模数据上的表现非常好,适合进行多分类任务。
程序编写
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat May 27 07:52:08 2017
@author: xiaolian
"""
import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer
from sklearn.cross_validation import train_test_split
from sklearn.metrics import classification_report
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
def load_datasets(feature_paths, label_paths):
feature = np.ndarray(shape = (0, 41))
label = np.ndarray(shape = (0, 1))
for file in feature_paths:
df = pd.read_table(file, delimiter = ‘,‘, na_values = ‘?‘
, header = None)
#print(df)
imp = Imputer(missing_values = ‘NaN‘, strategy = ‘mean‘, axis = 0)
imp.fit(df)
#print(df)
df = imp.transform(df)
# print(‘df type :‘, type(df))
#print(df)
feature = np.concatenate((feature, df))
#print(‘feature‘)
#print(feature)
for file in label_paths:
df = pd.read_table(file, header = None)
#print(‘df :‘, df)
label = np.concatenate((label, df))
#print(‘label‘, label)
label = np.ravel(label)
#print(‘label‘, label)
return feature, label
if __name__ == ‘__main__‘:
‘‘‘data path‘‘‘
featurePaths = [‘A/A.feature‘, ‘B/B.feature‘, ‘C/C.feature‘, ‘D/D.feature‘, ‘E/E.feature‘]
labelPaths = [‘A/A.label‘,‘B/B.label‘, ‘C/C.label‘, ‘D/D.label‘, ‘E/E.label‘]
load_datasets(featurePaths[:4], labelPaths[:4])
‘‘‘ load data ‘‘‘
x_train, y_train = load_datasets(featurePaths[:4],labelPaths[:4])
x_test, y_test = load_datasets(featurePaths[4:],labelPaths[4:])
x_train, x_, y_train, y_ = train_test_split(x_train, y_train, test_size = 0.0)
print(‘Start training knn‘)
knn = KNeighborsClassifier().fit(x_train, y_train)
print(‘Training done‘)
answer_knn = knn.predict(x_test)
print(‘Prediction done‘)
print(‘Start training DT‘)
dt = DecisionTreeClassifier().fit(x_train, y_train)
print(‘Training done‘)
answer_dt = dt.predict(x_test)
print(‘Prediction done‘)
print(‘Start training Bayes‘)
gnb = GaussianNB().fit(x_train, y_train)
print(‘Training done‘)
answer_gnb = gnb.predict(x_test)
print(‘Prediction done‘)
print(‘\n\nThe classification report for knn:‘)
print(classification_report(y_test, answer_knn))
print(‘\n\nThe classification report for DT:‘)
print(classification_report(y_test, answer_dt))
print(‘\n\nThe classification report for Bayes:‘)
print(classification_report(y_test, answer_gnb))