機器學習實例篇

  • 2019 年 10 月 6 日
  • 筆記

前言:

閱讀本篇文章需要閱讀:

數據分析篇(一),數據分析篇(二)

數據分析篇(三),數據分析(四)

數據分析篇(五),數據分析篇(六)

機器學習篇(一),機器學習篇(二),機器學習篇(三)。

k-近鄰演算法實例

數據來源:https://www.kaggle.com/c/facebook-v-predicting-check-ins

# 註冊該網站需要科學上網,下載數據也比較慢

# 後台回複數據獲取數據,科學上網插件也給大家,免費試用3天。

題目是這樣的:

本次比賽的目的是預測一個人想要登記的地方。為了本次比賽的目的,

Facebook創建了一個人工世界,其中包括10多公里10平方公里的100,000多個地方。

對於給定的坐標集,您的任務是返回最可能位置的排序列表。數據被製作成類似於來自移動

設備的位置訊號,讓您了解如何處理由不準確和嘈雜的值導致的實際數據。

不一致和錯誤的位置數據可能會破壞Facebook Check In等服務的體驗。

數據說明:

train.csv,test.csv

row_id:簽到事件的id

xy:坐標

準確度:定位精度

時間:時間戳

place_id:業務的ID,這是您預測的目標

# 我只用了train.csv,由於數據量太大。你可以兩個都用上。

實例:

# 導入模組api    import pandas as pd    # 標準化處理模組    from sklearn.preprocessing import StandardScaler    # 分割數據集    from sklearn.model_selection import train_test_split    # k-近鄰演算法    from sklearn.neighbors import KNeighborsClassifier    # k-近鄰預測用戶簽到位置    def knncls():        # 讀取數據        data = pd.read_csv("D:/shuju/train.csv")        #print(data.head(5))        '''            ID     x坐標   y坐標  坐標準確性 時間戳  預測目標           row_id   x       y     accuracy   time    place_id        0    0    0.7941  9.0809     54     470702  8523065625        1    1    5.9567  4.7968     13     186555  1757726713        2    2    8.3078  7.0407     74     322648  1137537235        3    3    7.3665  2.5165     65     704587  6567393236        4    4    4.0961  1.1307     31     472130  7440663949        '''        # 由於數據過大,很慢,這裡我選擇縮小數據(你可以不進行縮小,效果更好)        # 只取x在1.0-1.25之間的和y在2.5-2.75之間的,你可以隨意修改,也可以讀取全部        data = data.query('x > 1.0& x < 1.25 & y > 2.5 &y<2.75')        # 處理時間戳,unit = 's'表示按照秒轉換。        time_value = pd.to_datetime(data['time'],unit = 's')        #print(time_value) # 17467條數據        '''        863        1970-01-03 20:13:11        1693       1970-01-04 06:16:23        9877       1970-01-06 19:49:58        ...        Name: time, Length: 17467, dtype: datetime64[ns]        '''        # 把日期轉換成字典 轉換成字典可以獲取年月日等        time_value = pd.DatetimeIndex(time_value)        # 構造時間特徵加入到data中,選擇自己需要的特徵(年月都是一樣的,只獲取日,小時,工作日)        # 如果直接寫成data['day'] = time_value.day 會有警告資訊        data = data.copy()        data.loc[:,'day'] = time_value.day        data.loc[:,'hour'] = time_value.hour        data.loc[:,'weekday'] = time_value.weekday        # 刪除時間戳,按照列刪除,在pd中是1,在sklearn中是1        data = data.drop(['time'],axis=1)        # print(data)        '''                    row_id       x       y  accuracy   place_id  day  hour  weekday        863            863  1.3828  2.6444        64  5784939944    3    20        5        1693          1693  1.2583  2.6839        72  3952821602    4     6        6        '''        # 刪除目標值重複少於4個的數據,目標值太多        # 分組求個數        place_count = data.groupby('place_id').count()        # 分組後place_count.row_id為次數        # 按照place_id分組會將目標值當成索引,reset_index將索引變為0,1..加入到特徵列        tf = place_count[place_count>4].reset_index()        # 過濾掉少於4個簽到的目標值        data = data[data['place_id'].isin(tf.place_id)]        # 取出特徵值和目標值(刪除目標值)        y = data['place_id']        x = data.drop(['place_id'],axis = 1)        # 刪除row_id特徵        data = data.drop(['row_id'],axis=1)        # 數據分割成訓練集和測試集        # x_train:訓練集特徵值        # x_test:測試集特徵值        # y_train:訓練集目標值        # y_test:測試集目標值        x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25)        # 如果不做標準化處理使用k-近鄰演算法        # knn = KNeighborsClassifier(n_neighbors=5)        # 傳入訓練集的特徵值和目標值        # knn.fit(x_train,y_train)        # 得出預算結果,通過測試集的特徵值來預測        # y_predict = knn.predict(x_test)        # 查看準確率,輸入測試集的特徵值和目標值        # print('預測準確率為:',knn.score(x_test,y_test))        '''        預測準確率為: 0.011907487978016945        也就是1.1% 100個數據有1個對的        原因:1、數據沒有全用上,我這裡只抽取了部分數據             2、未做標準化處理             3、沒有刪除其他影響的特徵,比如row_id        在上面刪除下row_id來再試一下        得出:預測準確率為: 0.013510419051980764        增加了一點,但是效果不明顯,繼續做標準化處理        '''        # 使用標準化處理和交叉驗證網格搜索        std = StandardScaler()        # 這裡無論是訓練集還是測試集的特徵值都需要做標準化處理        x_train = std.fit_transform(x_train)        # 這裡不需要再調用fit,因為fit只是計算一些值,計算一遍之後就不需要了        x_test = std.transform(x_test)        knn = KNeighborsClassifier()        # 網格搜索        # 構造參數n_neighbors值進行搜索        param = {'n_neighbors':[2,5,10]}        gc = GridSearchCV(knn,param_grid = param,cv = 10)        # 傳入訓練集的特徵值和目標值        gc.fit(x_train,y_train)        # 得出預算結果,通過測試集的特徵值來預測        y_predict = gc.predict(x_test)        # 查看準確率,輸入測試集的特徵值和目標值        print('預測準確率為:',gc.score(x_test,y_test))        print('最好的結果:',gc.best_score_)        print('選擇的模型為也就是n_neighbors值:',gc.best_estimator_)        '''        預測準確率為: 0.4069557362240289        最好的結果: 0.40099382623098934        選擇的模型為也就是n_neighbors值: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',                   metric_params=None, n_jobs=None, n_neighbors=10, p=2,                   weights='uniform')        這個相比未做標準化差別就很大了,但是準確率依然還是不夠可以試試讀取所有數據。        '''    if __name__ == "__main__":        knncls()  

#注釋很詳細,這裡不做說明。

樸素貝葉斯演算法實例

數據來源:Sklearn自帶數據集

20newsgroups數據集是用於文本分類、文本挖據和資訊檢索研究的國際標準數據集之一。

數據集收集了大約20,000左右的新聞組文檔,均勻分為20個不同主題的新聞組集合。

實例:

import pandas as pd  from sklearn.datasets import fetch_20newsgroups  # 分詞  from sklearn.feature_extraction.text import TfidfVectorizer  #樸素貝葉斯演算法  from sklearn.naive_bayes import MultinomialNB  def naviebayes():      '''      朴樹貝葉斯演算法實例      '''      # 讀取數據      news = fetch_20newsgroups(subset='all')      # 數據分割      x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25)      # 分詞用TfidfVectorizer      tf = TfidfVectorizer()      # 用訓練集分詞統計詞的重要性      x_train = tf.fit_transform(x_train)      x_test = tf.transform(x_test)      # 使用樸素貝葉斯演算法預算      mlt = MultinomialNB(alpha=1.0)      mlt.fit(x_train,y_train)      y_predict = mlt.predict(x_test)      print('預算準確率為:',mlt.score(x_test,y_test))      '''      預算準確率為: 0.8433786078098472      '''  if __name__ == "__main__":      naviebayes()  

其他

菜單右下角 誠意相冊點一點。感謝!!

Tags: