機器學習實例篇
- 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() 其他
菜單右下角 誠意相冊點一點。感謝!!