基于python3.7 numpy scipy matplotlib sklearn的机器学习笔记5—监督学习之KNN、DT、NB算法简析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingtaoqian8521/article/details/87787095

1、KNN :通过计算待分类数据点,与 已有数据集中的所点距离。取距离最小的前 K个点,根据“少数服从 多数“的原则,将这个据点划分为出现次数最多的那个类别。

在sklearnsklearn 库中,可以使用 sklearn.neighbors.KNeighborsClassifier 创建一个 K近邻分类器,主要参数有:
• n_neighbors:用于指定分类器中 K的大小 (默认值为 5,注意与 kmeans  的区别 )
• weights :设置选中的 K个点对分类结果影响的权重(默认值为平均 权重“ uniform  ”,可以选择“ distance  ”代表越近的点权重高, 或传入自己编写的以距离为参数的权重计算函数
•algorithm :设置用于计算临近点的方法,因为当数据量很大情况 下计算当前点和所有的 距离再选出最近k各点,这个计算量是很 费时的,所以(选项中有 ball_tree 、kd_tree 和brute ,分别代表不 同的寻找邻居优化算法, 默认值为 auto ,根据训练数自动 选择)

在实际使用时,我们可以所有训练数据构成特征 X 和标签 y,使用 fit() 函数进行训练。在正式分类时,通过一次性构造测试集或者一个一个输入 样本的方式,得到对应分类结果。有关 K 的取值 :
• 如果 较大, 相当于使用邻域中的训练实例进行预测可以减小估计误差但是距离较远的样本也会对预测起作用,导致错误。
• 相反地,如果 K 较小,相当于使用的邻域进行预测如果居恰好是噪 声点,会导致过拟合。
• 一般情况下, K 会倾向选取较小的值,并使用交叉验证法最优 K 值

2决策树 是一种树形结构的分类器,通过顺序 询问分类点的属性决定最终类别。通常根据特征的信息增益或其他指标,构建一颗决策树。在分类时,只需要按照决策中的结点依次进行判断,即可得到样本所属类别。

3、朴素贝叶斯分类器是一个以贝叶斯定理为基础 的多分类器。对于给定数据,首先基于特征的条件独立性假 设,学习输入输出的联合概率分布然后基于此模型,对给定的输入 x,利用贝叶斯定理求出后验概 率最大的输出 y。

特点:朴素贝叶斯是典型的生成学习方法,由训练数据学习联合概率分布并求得 后验概率分布。朴素 贝叶斯一般在小规模数据上的表现很好,适合进行多分类任务。

基于SVM的股市趋势预测

数据集文末下载

##股市趋势预测
import time
import pandas as pd#加载csv数据的工具包
import numpy as np
from sklearn import svm#svm算法
from sklearn import model_selection#交叉验证注:前面版本用cross_vallidation
#数据加载与预处理  
data=pd.read_csv('stock/000777.csv',encoding='gbk',parse_dates=[0],index_col=0)
data.sort_index(0,ascending=True,inplace=True)#将data数据按照行索引顺序进行排列,从小到大
#print(data)#class 'pandas.core.frame.DataFrame
print(data.shape)#(4752, 14)
'''
              股票代码    名称    收盘价  ...          成交金额           总市值          流通市值
日期                                ...                                          
1997-06-16  '000777  中核苏阀   0.00  ...  0.000000e+00  2.398500e+08  0.000000e+00
1997-06-17  '000777  中核苏阀   0.00  ...  0.000000e+00  2.398500e+08  0.000000e+00
'''

#这里选取5列数据为特征:收盘价,最高价,最低价,开盘价,成交量
dayfeature=150
featurenum=5*dayfeature
x=np.zeros((data.shape[0]-dayfeature,featurenum+1))#4602,750
y=np.zeros((data.shape[0]-dayfeature))
##x:记录150天的数据
#y:记录涨和跌
'''
data.shape[0]-dayfeature指的是我们要用150天的数据做训练,也就是说:150天后的所有数据
才是根据前150天数据来训练的,所以训练集的大小是4752—150,对于每一条数据,他的特征都是前
150天的所有特征数据(150*5),+1是将当天的开盘价引入作为一条特征数据
'''
#将数据中的“收盘价”“最高价”“开盘价”“最低价”“成交量”存入x
#数组中
for i in range(0,data.shape[0]-dayfeature):
    x[i,0:featurenum]=np.array(data[i:i+dayfeature] \
              [[u'收盘价',u'最高价',u'最低价',u'开盘价',u'成交量']]).reshape((1,featurenum))
    x[i,featurenum]=data.ix[i+dayfeature][u'开盘价']#最后一列记录当日的开盘价
     
for i in range(0,data.shape[0]-dayfeature):
    if data.ix[i+dayfeature][u'收盘价']>=data.ix[i+dayfeature][u'开盘价']:
        y[i]=1
    else:
        y[i]=0          
#如果当天收盘价高于开盘价,y[i]=1代表涨,0代表跌
clf=svm.SVC(kernel='rbf')#调用 svm 函数 ,并设置 kernel参数 ,默认是 rbf ,其它:linear poly sigmoid
start=time.clock()
result = []
for i in range(5):
    x_train, x_test, y_train, y_test = \
                    model_selection.train_test_split(x, y, test_size = 0.2)
    #x和y的验证集和测试集,切片80—20%的测试集
    clf.fit(x_train, y_train)
    #训练数据进行训练
    result.append(np.mean(y_test == clf.predict(x_test)))
    #将预测数据和测试集的验证数据比对
print("svm classifier accuacy:")
print(result)
end=time.clock()
print("running time %s Seconds"%(end-start))

###代码中提到了交叉验证,其原理如下图

基于人体运动数据的姿态识别

import pandas as pd
import numpy as np  
     
from sklearn.preprocessing import Imputer
from sklearn.model_selection 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_csv(file, delimiter=',', na_values='?', header=None)
        imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
        imp.fit(df)
        df = imp.transform(df)
        print(df.shape)
        feature = np.concatenate((feature, df))
        print(feature.shape)###测试memoryError原因,发现是因为numpy数组维数过大引起的
        #解决办法安装64位python,,这里选择了减小训练数据量
    for file in label_paths:
        df = pd.read_csv(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']
    featurePaths = ['A/A.feature','B/B.feature','C/C.feature']
    labelPaths = ['A/A.label','B/B.label','C/C.label']

    x_train,y_train = load_datasets(featurePaths[:2],labelPaths[:2])#使用前两组数据作为训练数据
    print(x_train.shape)
    x_test,y_test = load_datasets(featurePaths[2:],labelPaths[2:])#最后一组作为测试数据
    x_train, x_, y_train, y_ = train_test_split(x_train, y_train, test_size = 0.0)
    print(x_test.shape)    
    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))

实验结果

            precision    recall  f1-score   support

         0.0       0.50      0.49      0.49     78495
         1.0       0.57      0.83      0.68     22044
         2.0       0.58      0.44      0.50     28761
         3.0       0.26      0.27      0.27     20533
         4.0       0.81      0.66      0.73     29036
         7.0       0.00      0.00      0.00         0
        12.0       0.25      0.41      0.31     10389
        13.0       0.42      0.37      0.40     15275
        16.0       0.64      0.76      0.70     20325
        17.0       0.49      0.41      0.45     27975

   micro avg       0.52      0.52      0.52    252833
   macro avg       0.45      0.46      0.45    252833
weighted avg       0.53      0.52      0.52    252833

The classification report for DT:
              precision    recall  f1-score   support

         0.0       0.36      0.38      0.37     78495
         1.0       0.66      0.65      0.65     22044
         2.0       0.45      0.42      0.43     28761
         3.0       0.00      0.00      0.00     20533
         4.0       0.06      0.03      0.04     29036
         5.0       0.00      0.00      0.00         0
         6.0       0.00      0.00      0.00         0
         7.0       0.00      0.00      0.00         0
        12.0       0.25      0.31      0.27     10389
        13.0       0.47      0.25      0.33     15275
        16.0       0.59      0.87      0.70     20325
        17.0       0.58      0.60      0.59     27975
        24.0       0.00      0.00      0.00         0

   micro avg       0.39      0.39      0.39    252833
   macro avg       0.26      0.27      0.26    252833
weighted avg       0.38      0.39      0.38    252833

The classification report for Bayes:
              precision    recall  f1-score   support

         0.0       0.52      0.83      0.64     78495
         1.0       0.99      0.90      0.94     22044
         2.0       0.71      0.53      0.61     28761
         3.0       0.88      0.84      0.86     20533
         4.0       0.80      0.00      0.00     29036
         5.0       0.00      0.00      0.00         0
         7.0       0.00      0.00      0.00         0
        12.0       0.09      0.03      0.04     10389
        13.0       0.05      0.00      0.01     15275
        16.0       0.95      0.46      0.62     20325
        17.0       0.91      0.80      0.85     27975
        24.0       0.00      0.00      0.00         0

   micro avg       0.59      0.59      0.59    252833
   macro avg       0.49      0.37      0.38    252833
weighted avg       0.67      0.59      0.57    252833

上述实验数据集https://download.csdn.net/download/jingtaoqian8521/10967071或留下邮箱,看到我会发的

--------------------------------------------------------------------------------------------------------------------参考mooc网课,北理工python机器学习应用课程

猜你喜欢

转载自blog.csdn.net/jingtaoqian8521/article/details/87787095