赞
踩
有监督学习就是有事先标注好的数据,如果数据标注是离散的,并且是代表一个类别的标签,并且训练样本使样本获得正确的类别标签,这样就是一个分类任务。如果是一个目标值,训练模型使其可以预测出新样本对应的数值——这时模型的目标是连续的,那这就是一个回归任务
无监督学习就是没有人工主观标注的数据,只有目标和目标的客观特征值,但是还是可以通过对特征值的相关性的计算进行一个归类,这就是无监督学习中的聚类任务
分类是实现有标注好的分类标签,训练分类模型,然后将新的样本归于已有的分类的过程
回归是给定样本的目标值,训练回归模型,对一个新的样本,进行目标值的预测的过程
在交易中,如果是预测未来股票是涨或者跌,这时就是一个分类的过程,是分类任务;如果是预测股票未来的股票是涨多少,还是跌多少,这时就是一个回归的过程
如果使用算法来进行交易的话,最关心的就是模型是否可以准确地预测出股票的涨跌或者涨幅。实际上,模型是不可能做到百分之百准确的,这就需要我们对模型的性能进行评估,以便找到最可用的模型。要达到这个目的,我们就需要将掌握的数据集(dataset)拆分为训练集(trainset)和验证集(testset),使用训练集训练模型,并使用验证集来评估模型是否可用
举一个例子,假如有某只股票100天的价格数据,就可以将前80天的数据作为训练集,将后20天的数据作为验证集,同时评估模型分别在训练集与验证集中的准确率。如果模型在训练集中的得分很高,而在验证集中的得分很低,就说明模型出现了过拟合(over-fitting)的问题;而如果模型在训练集和验证集中的得分都很低,就说明模型出现了欠拟合(under-fitting)的问题
要解决这些问题,小瓦就需要调整模型的参数、补充数据,或者进行更细致的特征工程
学习使用python的sklearn库进行常见的机器学习算法的学习
KNN(K-Nearest Neighbor,K最近邻)是较简单且易于理解的算法之一。它既可以用于分类任务,也可以用于回归任务
KNN算法的原理十分容易理解:它识别k个最近的数据点(基于欧几里得距离)来进行预测,它分别预测邻域中最频繁的分类或是回归情况下的平均结果。用通俗的话讲,已知大部分皮肤比较白的人是欧洲人,大部分皮肤比较黑的人是非洲人。现在给你介绍一位朋友,让你判断他来自哪个国家。通过目测,你发现这位朋友与3位非洲朋友的肤色比较接近,与1位欧洲朋友的肤色比较接近,这时,你大概率会把这位新朋友归到非洲人的分类当中
对于回归任务来说,KNN的工作机理也是相似的。例如,你打算去买一套房子,在同一个小区当中发现有3套户型和面积都十分接近的房屋。第一套的售价是500万元,第二套的售价是520万元,而第三套的售价未知。鉴于第三套的情况与前面两套十分接近,你可以大致估算出它的售价会是510万元左右,即前两套房子售价的均值
scikit-learn内置了一些供大家学习的玩具数据集(toy dataset),其中有些是分类任务的数据,有些是回归任务的数据。首先我们使用一个最简单的鸢尾花数据集来演示KNN算法在分类中的应用
输入代码如下:
#codeing=utf-8
import matplotlib.pyplot as plt
import seaborn as sns
#导入鸢尾花数据和KNN模型
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
if __name__ == '__main__':
iris = load_iris()
print('keys:', iris.keys())
print('feature_names:', iris.feature_names)
print('target:', iris.target)
输出数据如下:
我们看到,该数据集存储了若干个键(key),这里我们重点关注一下其中的target和feature_names,因为这两个键对应的分别是样本的分类标签和特征名称
数据集中的样本共有4个特征,分别是
数据集中的样本分为3类,分别用0、1、2这3个数字来表示
这个数据集的目的是:根据样本鸢尾花萼片和花瓣的长度及宽度,结合分类标签来训练模型,以便让模型可以预测出某一种鸢尾花属于哪个分类
将数据拆分为训练集和测试集
输入代码如下:
#codeing=utf-8 import matplotlib.pyplot as plt import seaborn as sns #导入鸢尾花数据和KNN模型 from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier #导入数据集拆分工具 from sklearn.model_selection import train_test_split if __name__ == '__main__': iris = load_iris() #print('keys:', iris.keys()) #print('feature_names:', iris.feature_names) #print('target:', iris.target) X, y = iris.data, iris.target print('X shape:', X.shape) print(X[:1]) #将X和y拆分为训练集和验证集 X_train, X_test, y_train, y_test = train_test_split(X, y) #查看拆分情况 print('X train:', X_train.shape) print('X test:', X_test.shape)
输出数据如下:
可以看出,我们将数据集的特征赋值给了X,而将分类标签赋值给了y。通过查看X的形态和第一条数据,可知样本数量共有150个,每个样本有4个特征
通过拆分,训练集中的样本数量为112个,其余的38个样本则进入了验证集
输入代码如下:
#创建KNN分类器,参数保持默认设置
knn_clf = KNeighborsClassifier()
#使用训练集拟合模型
knn_clf.fit(X_train, y_train)
#查看模型在训练集和验证集中的准确率
print('训练集准确率:%.2f' % knn_clf.score(X_train, y_train))
print('验证集准确率:%.2f' % knn_clf.score(X_test, y_test))
输出数据如下:
注意这个数据并不是一个稳定值,因为每次切分的训练集和测试集都不一样,所以准确率也不一样,但是基本都是90%以上
需要说明的是,在scikit-learn中,KNN可以通过调节n_neighbors参数来改进模型的性能。在不手动指定的情况下,KNN默认的近邻参数n_neighbors为5。那么这个参数是最优的吗?我们可以使用网格搜索法来寻找到模型的最优参数
输入代码如下:
#codeing=utf-8 import matplotlib.pyplot as plt import seaborn as sns #导入鸢尾花数据和KNN模型 from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier #导入数据集拆分工具 from sklearn.model_selection import train_test_split # 导入网络搜索 from sklearn.model_selection import GridSearchCV if __name__ == '__main__': iris = load_iris() #print('keys:', iris.keys()) #print('feature_names:', iris.feature_names) #print('target:', iris.target) X, y = iris.data, iris.target #print('X shape:', X.shape) #print(X[:1]) #将X和y拆分为训练集和验证集 #X_train, X_test, y_train, y_test = train_test_split(X, y) #查看拆分情况 #print('X train:', X_train.shape) #print('X test:', X_test.shape) #创建KNN分类器,参数保持默认设置 #knn_clf = KNeighborsClassifier() #使用训练集拟合模型 #knn_clf.fit(X_train, y_train) #查看模型在训练集和验证集中的准确率 #print('训练集准确率:%.2f' % knn_clf.score(X_train, y_train)) #print('验证集准确率:%.2f' % knn_clf.score(X_test, y_test)) # 定义一个从1-10的n_neighbors n_neighbors = tuple(range(1, 11)) # [1-11)每个一个数取值,存储元祖,(1,2,3,...10) # 创建网络搜索实例,estimator用KNN分类器 # 把刚刚定义的n_neighbors传入给param_grid参数 # cv参数指交叉验证次数为5 cv = GridSearchCV(estimator=KNeighborsClassifier(), param_grid={'n_neighbors': n_neighbors}, cv=5) # 使用网络搜索拟合数据集 cv.fit(X, y) # 查看最优参数 print('最优参数:', cv.best_params_) # {'n_neighbors': 6}
输出数据如下:
从上面的代码运行结果可以看到,程序将网格搜索找到的最优参数进行了返回——KNN分类器的最优n_neighbors参数是6。也就是说,当n_neighbors参数为6
时,模型的准确率是最高的
下面我们就来看一下当把n_neighbors设置为6时,模型的准确率
输入代码如下:
#创建KNN分类器,参数保持默认设置
#knn_clf = KNeighborsClassifier()
knn_clf = KNeighborsClassifier(n_neighbors=6)
#使用训练集拟合模型
knn_clf.fit(X_train, y_train)
#查看模型在训练集和验证集中的准确率
print('训练集准确率:%.2f' % knn_clf.score(X_train, y_train))
print('验证集准确率:%.2f' % knn_clf.score(X_test, y_test))
输出数据如下:
可以看到,当把n_neighbors参数设置为6时,在训练集和验证集都有一定的准确率提升
下面展示KNN算法在回归任务中的应用
使用Boston房价数据集,该数据集中有506个样本,每个样本有13个特征,以及对应的价格(target)
输入代码如下:
def boston_sample():
#将数据导入
boston = load_boston()
#查看数据集的键名,特征名,房屋售价
print('keys:', boston.keys())
print('feature_names:', boston.feature_names)
print('target:', boston.target[:10])
boston_sample()
输出数据如下:
可以看出,数据集中存储了5个键,这里我们重点关注target(房屋的售价)及feature_names(房屋的特征)
其中样本全部的特征名称,包括房间数量RM、房龄AGE等共计13个
最后是返回的前10套房屋售价
与分类任务一样,在回归任务中,我们也要使用训练集来训练模型,并使用验证集来验证模型的性能
输入代码如下:
def boston_sample(): #将数据导入 boston = load_boston() #查看数据集的键名,特征名,房屋售价 #print('keys:', boston.keys()) #print('feature_names:', boston.feature_names) #print('target:', boston.target[:10]) #将样本特征和售价赋值给X,y X, y = boston.data, boston.target #使用train_test_split拆分为训练集和验证集 X_train, X_test, y_train, y_test = train_test_split(X, y) #查看拆分的结果 print('X train:', X_train.shape) print('X test:', X_test.shape) boston_sample()
输出数据如下:
可以看到,训练集中有379个样本,其余127个样本进入了验证集
下面开始训练模型,输入代码如下:
def boston_sample(): #将数据导入 boston = load_boston() #查看数据集的键名,特征名,房屋售价 #print('keys:', boston.keys()) #print('feature_names:', boston.feature_names) #print('target:', boston.target[:10]) #将样本特征和售价赋值给X,y X, y = boston.data, boston.target #使用train_test_split拆分为训练集和验证集 X_train, X_test, y_train, y_test = train_test_split(X, y) #查看拆分的结果 #print('X train:', X_train.shape) #print('X test:', X_test.shape) #创建一个实例,参数保持默认设置 knn_reg = KNeighborsRegressor() #拟合训练集数据 knn_reg.fit(X_train, y_train) #查看模型在训练集和验证集的性能表现 print('训练集准确率:%.2f' % knn_reg.score(X_train, y_train)) print('验证集准确率:%.2f' % knn_reg.score(X_test, y_test)) boston_sample()
输出数据如下:
从上面的代码运行结果可以看到,缺省参数的KNN回归模型在该数据集中的性能表现差强人意,在训练集中的准确率只有67%,而在验证集中则更加糟糕,只有46%。这说明模型出现了欠拟合的问题,我们需要对数据集进行处理,或者对模型进行调优
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。