背景介绍
- 可穿戴式设备的流行,让我们可以更便利地使用传感器获取人体的各项数据,甚至生理数据。
- 当传感器采集到大量数据后,我们就可以通过对数据进行分析和建模,通过各项特征的数值进行用户状态的判断,根据用户所处的状态提供给用户更加精准、便利的服务。
数据介绍
- 我们现在收集了来自A,B,C,D,E 5位用户的可穿戴设备上的传感器数据,每位用户的数据集包含一个特征文件(a.feature)和一个标签文件(a.label)。
- 特征文件中每一行对应一个时刻的所有传感器数值,标签文件中每一行记录了和特征文件中对应时刻的标记过的用户姿态,两个文件的行数相同,相同行之间互相对应。
数据介绍- feature
我们的特征文件共包含41列特征,数据内容。
特征文件的各项特征,如下表所示:
数据介绍- label
标签文件内容如图所示,每一个代表与特征文件中对应行的用户姿态类别。总共有0-24种共25种身体姿态,如,无活动状态、坐态、跑态等。标签文件作为训练集的标准参考准则,可以进行特征的监督学习。
任务介绍
- 假设现在出现了一个新用户,但我们只有传感器采集的数据,那么该如何得到这个新用户的姿态呢?
- 又或者对同一个用户如果传感器采集了新的数据,怎么样根据新的数据判断当前用户处于什么样的姿态呢?
- 在明确这是一个分类问题的情况下,我们可以选定某种分类模型(或者说是算法),通过使用训练数据进行模型学习,然后对每个测试样本给出对应的分类结果。
- 机器学习的分类算法众多,在接下来的学习中我们将会详细介绍经典的分类算法,如K近邻、决策树和朴素贝叶斯的原理和实现。
K近邻分类器(KNN)
原理:
通过计算待分类数据点,与已有数据集中的所有数据点的距离。取距离最小的前k个点,根据“少数服从多数”的原则,将这个数据点划分为出现次数最多的那个类别。
sklearn中的KNN
在sklearn库中,可以使用sklearn.neighbors.KNeighborsClassifier创建一个K近邻分类器,主要参数有:
- n_neighbors:用于指定分类器中K的大小(默认值为5)
- weights:设置选中的K个点对分类结果影响的权值(默认值为平均权值“uniform”,可以选择“distance”代表越近的点权重越高,或者传入自己编写的以距离为参数的权重计算函数)。
KNN的使用
- 使用import语句导入K近邻分类器:
from sklearn.neighbors import KNeighborsClassifier
- 创建一组数据X和它对应的标签y:
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
- 参数n_neighbors设置为3,即使用最近的3个近邻作为分类的依据,其他参数保持默认值,并将创建好的实例赋给变量neigh:
neigh = KNeighborsClassifier(n_neighbors=3)
- 调用fit()函数,将训练数据X和标签y送入分类器进行学习:
neigh.fit(X, y)
- 调用predict()函数,对未知分类样本[1.1]分类,可以直接将需要分类的数据构造为数组形式作为参数传入,得到分类标签作为返回值:
print(neigh.predict([[1.1]]))
>>> [0]
KNN的使用经验
在实际使用时,我们可以使用所有训练数据构成特征X和标签y,使用fit()函数进行训练。在正式分类时,通过一次性构造测试集或者一个一个输入样本的方式,得到样本对应的分类结果。有关K的取值:
- 如果较大,相当于使用较大邻域中的训练实例进行预测,可以减小估计的误差,但是距离较远的样本也会对预测起作用,导致预测错误。
- 相反地,如果K较小,相当于使用较小地邻域进行预测,如果邻居恰好是噪声点,会导致过拟合。
- 一般情况下,K会倾向于选取较小的值,并使用交叉验证法选取最优K值。
决策树
原理:
决策树是一种树形结构的分类器,通过顺序询问分类点的属性决定分类点最终的类别。通常根据特征的信息增益或其他指标,构建一颗决策树。在分类时,只需要按照决策树中的节点依次进行判断,即可得到样本所属类别。
- 决策树本质上是寻找一种对特征空间上的划分,旨在构建一个训练数据拟合的好,并且复杂度小的决策树。
- 实际使用中,需要根据数据情况,调整DecisionTreeClassifier类中传入的参数,比如选择合适的criterion,设置随机变量等。
sklearn中的决策树
在sklearn库中,可以使用sklearn.tree.DecisionTreeClassifier创建一个决策树用于分类,其主要参数有:
- criterion:用于选择属性的准则,可以传入“gini”代表基尼系数,或者“entropy”代表信息增益。
- max_features:表示在决策树节点进行分裂时,从多少个特征中选择最优特征。可以设定固定数目、百分比或其他标准。默认值时使用所有特征个数。
决策树的使用
- 首先,导入sklearn内嵌的鸢尾花数据集
from sklearn.datasets import load_iris
- 使用import语句导入决策树分类器,同时导入计算交叉验证值的函数cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
- 使用默认参数,创建一颗基于基尼系数的决策树,并将该决策树分类器赋值给变量clf
clf = DecisionTreeClassifier()
- 将鸢尾花数据赋值给变量iris
iris = load_iris()
- 这里我们将决策树分类器做为待评估的模型,iris.data鸢尾花数据做为特征,iris.target鸢尾花分类标签做为目标结果,通过设定cv=10,使用10折交叉验证。得到最终的交叉验证得分
cross_val_score(clf, iris.data, iris.target, cv=10)
- 实验结构:
[1. 0.93333333 1. 0.93333333 0.93333333 0.86666667
0.93333333 0.93333333 1. 1. ]
实例编写
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)
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit(df)
df = imp.transform(df)
feature = np.concatenate((feature, df))
for file in label_paths:
df = pd.read_table(file, header=None)
label = np.concatenate((label, df))
label = np.ravel(label)
return feature, label
if __name__ == '__main__':
''' ����·�� '''
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']
''' �������� '''
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))