<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用Python實(shí)現(xiàn)常用的分類算法

          共 5231字,需瀏覽 11分鐘

           ·

          2021-05-10 09:03


          01

          數(shù)據(jù)分類


          正所謂物以類聚人與群分,生活里很多東西都存在著分類,當(dāng)你進(jìn)入超市的時(shí)候有著“日常生活用品”,“零食區(qū)”,“衣服類”等等的分類,一個(gè)分類里有不同的商品。


          02

          分類方法


          那么問(wèn)題來(lái)了,怎么分類呢?按照什么分類呢?我們?nèi)匀挥贸械姆诸悂?lái)說(shuō)明,在超市的分類中,我們可以看到在同一個(gè)類中的商品用途是差不多的。也有的分類是按照商品的性質(zhì)來(lái)分的。如果是按照商品的用途這一單一的規(guī)則來(lái)分類的話,我們通常叫這種分類方式為OneR算法(One Rule一個(gè)規(guī)律算法),這也是今天我們要說(shuō)的分類方法。


          03

          OneR算法


          那么什么是OneR算法呢?簡(jiǎn)單的來(lái)說(shuō)是,根據(jù)現(xiàn)有的數(shù)據(jù)集,具有相同的特征值的個(gè)體最可能屬于哪個(gè)類別,然后進(jìn)行分類。當(dāng)然這邊的分類依據(jù)只是根據(jù)一種規(guī)則來(lái)進(jìn)行分類的。在數(shù)據(jù)分類部分還有一些分類算法,這些算法跟OneR算法比較起來(lái)復(fù)雜了許多,而且也更加的準(zhǔn)確。既然這樣的話,也許你會(huì)問(wèn),既然還有更好用的算法為什么要用這個(gè)比較”low“的算法呢?這樣說(shuō)起來(lái)也對(duì),但是這個(gè)OneR算法在很多真實(shí)數(shù)據(jù)上的應(yīng)用算是很常見(jiàn)的了!

          上面的熱身結(jié)束,重頭戲來(lái)了!!!


          04

          代碼實(shí)現(xiàn)


          1、準(zhǔn)備數(shù)據(jù)集
          要進(jìn)行數(shù)據(jù)分類怎么能缺少數(shù)據(jù)集呢?這邊我們將使用著名的Iris植物分類數(shù)據(jù)集,這個(gè)數(shù)據(jù)集里有150條植物信息。下面我們來(lái)導(dǎo)入這個(gè)數(shù)據(jù)集,根據(jù)下面的代碼以及圖片的展示我們可以發(fā)現(xiàn)這個(gè)植物分類數(shù)據(jù)集有4個(gè)特征值,分別為:sepal length、sepal width、petal length、petal width(分別表示的萼片和花瓣的長(zhǎng)寬)

          from sklearn.datasets import load_iris
          import numpy as np
          dataset = load_iris()
          x = dataset.data
          y = dataset.target
          print(dataset.DESCR)


          數(shù)據(jù)準(zhǔn)備:

          import numpy as np
          # data 為特征值
          data = dataset.data
          # target為分類類別
          target = dataset.target
          average_num = data.mean(axis = 0)
          data = np.array(data > average_num,dtype = "int")
          #print(dataset)     # 可以自己嘗試打印看看數(shù)據(jù)內(nèi)容
          from sklearn.model_selection import train_test_split
          # 隨機(jī)獲得訓(xùn)練和測(cè)試集
          def get_train_and_predict_set(): 
              #對(duì)應(yīng)的參數(shù)意義   data(待劃分樣本數(shù)據(jù))  target(樣本數(shù)據(jù)的結(jié)果) random_state(設(shè)置隨機(jī)種子,默認(rèn)值為0 如果為0則的話每次隨機(jī)結(jié)果都不一樣,反之是一樣的)
              return train_test_split(data,target, random_state=14)
          data_train,data_predict,target_train,target_predict = get_train_and_predict_set()



          2、實(shí)現(xiàn)算法

          我們之前就說(shuō)到,我們是根據(jù)一個(gè)規(guī)則來(lái)實(shí)現(xiàn)分類的。首先我們先遍歷每個(gè)特征的取值,對(duì)每個(gè)特征的取值,統(tǒng)計(jì)它在不同的類別出現(xiàn)的次數(shù),然后找到最大值,并記錄它在其他類別中出現(xiàn)的次數(shù)(為了統(tǒng)計(jì)錯(cuò)誤率)。

          from collections import defaultdict
          from operator import itemgetter
          #定義函數(shù)訓(xùn)練特征
          def train_feature(data_train,target_train,index,value):
              """
                  data_train:訓(xùn)練集特征
                  target_train:訓(xùn)練集類別
                  index:特征值的索引
                  value :特征值
              """

              count = defaultdict(int)
              for sample,class_name in zip(data_train,target_train):
                  if(sample[index] ==value):
                      count[class_name] += 1

                 # 進(jìn)行排序
              sort_class = sorted(count.items(),key=itemgetter(1),reverse = True)
              # 擁有該特征最多的類別
              max_class = sort_class[0][0]
              max_num = sort_class[0][1]
              all_num = 0

              for class_name,class_num in sort_class:
                  all_num += class_num
          #     print("{}特征,值為{},錯(cuò)誤數(shù)量為{}".format(index,value,all_num-max_num))
              # 錯(cuò)誤率
              error = 1 - (max_num / all_num)
              #最后返回使用給定特征值得到的待預(yù)測(cè)個(gè)體的類別和錯(cuò)誤率
              return max_class,error

          對(duì)于某個(gè)特征,遍歷其每一個(gè)特征值,每次調(diào)用train_feature這個(gè)函數(shù)的時(shí)候,我們就可以得到預(yù)測(cè)的結(jié)果以及這個(gè)特征的最大錯(cuò)誤率,也可以得到最好的特征以及類型,下面我們進(jìn)行函數(shù)的編寫:

          def train():
              errors = defaultdict(int)
              class_names = defaultdict(list)
              # 遍歷特征
              for i in range(data_train.shape[1]):
                 # 遍歷特征值 
                  for j in range(0,2):
                      class_name,error = train_feature(data_train,target_train,i,j)
                      errors[i] += error
                      class_names[i].append(class_name)            
              return errors,class_names

          errors,class_names = train()
          # 進(jìn)行排序
          sort_errors = sorted(errors.items(),key=itemgetter(1))
          best_error = sort_errors[0]

          best_feature = best_error[0]
          best_class = class_names[best_feature]
          print("最好的特征是{}".format(best_error[0]))
          print(best_class)


          3、測(cè)試算法

          # 進(jìn)行預(yù)測(cè)
          def predict(data_test,feature,best_class):
              return np.array([best_class[int(data[feature])] for data in data_test])

          result_predict = predict(data_predict,best_feature,best_class)

          print("預(yù)測(cè)準(zhǔn)確度{}".format(np.mean(result_predict == target_predict) * 100))

          print("預(yù)測(cè)結(jié)果{}".format(result_predict))



          我們可以發(fā)現(xiàn)預(yù)測(cè)的準(zhǔn)確度為65.79%,這個(gè)準(zhǔn)確度對(duì)于OneR算法來(lái)說(shuō)已經(jīng)很高啦!到此OneR算法完成啦!再次強(qiáng)調(diào)歡迎大家的指導(dǎo)批評(píng),謝謝。

          點(diǎn)分享
          點(diǎn)收藏
          點(diǎn)點(diǎn)贊
          點(diǎn)在看
          瀏覽 93
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  激情视频久久 | 欧美三级网站在线 | 五月成人丁香婷婷 | 久久久成人影院 | 啪啪免费看 |