日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

唐宇迪机器学习笔记5:K近邻算法实战

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 唐宇迪机器学习笔记5:K近邻算法实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、K近鄰算法概述

1、Airbnb 房價預測任務

數據讀取

數據特征

2、K近鄰原理

3、距離的定義(歐氏距離)

4、實例

二、模型的評估

1、首先制定好訓練集和測試集

2、基于單變量預測價格

3、進行衡量

三、數據預處理

特征數據預處理——標準化與歸一化

標準化

歸一化

四、sklearn庫與功能

五、多變量KNN模型

1、多變量距離的計算

2、多變量KNN模型?

3、使用Sklearn來完成KNN?

4、加入更多的特征


分類/回歸問題都可以用該算法解決

一、K近鄰算法概述

1、Airbnb 房價預測任務

數據讀取

import pandas as pdfeatures = ['accommodates','bedrooms','bathrooms','beds','price','minimum_nights','maximum_nights','number_of_reviews']dc_listings = pd.read_csv('listings.csv')dc_listings = dc_listings[features]print(dc_listings.shape)dc_listings.head()

數據特征

  • accommodates: 可以容納的旅客
  • bedrooms: 臥室的數量
  • bathrooms: 廁所的數量
  • beds: 床的數量
  • price: 每晚的費用
  • minimum_nights: 客人最少租了幾天
  • maximum_nights: 客人最多租了幾天
  • number_of_reviews: 評論的數量

如果我有一個1個房間的房子,我能租多少錢呢???再綜合考慮這三個就得到了我的房子大概能值多錢!

需要去看看1個房間的別人都租到多少錢!

K代表候選對象個數,也就是找和房間數量最相近的其他房子的價格

2、K近鄰原理

假設我們的數據源中只有5條信息,現在想針對我的房子(只有一個房間)來定一個價格。

在這里假設我們選擇的K=3,也就是選3個跟我最相近的房源。?

?綜合考慮這三個,得到了我的房子大概能值多錢!

3、距離的定義(歐氏距離)

?如何才能知道哪些數據樣本跟我最相近呢?

其中Q1到Qn是一條數據的所有特征信息,P1到Pn是另一條數據的所有特征信息

4、實例

1、假設我們的房子有3個房間

import numpy as npour_acc_value = 3dc_listings['distance'] = np.abs(dc_listings.accommodates - our_acc_value) dc_listings.distance.value_counts().sort_index()

2、這里我們只用了絕對值來計算,和我們距離為0的(同樣數量的房間)有461個?

3、 洗牌(打亂順序),得到洗牌后的數據

dc_listings = dc_listings.sample(frac=1,random_state=0) dc_listings = dc_listings.sort_values('distance') dc_listings.price.head()

?

4、問題:這里面的數據是字符串,需要轉換一下!?

dc_listings['price'] = dc_listings.price.str.replace("\$|,",'').astype(float)mean_price = dc_listings.price.iloc[:5].mean() mean_price

5、得到了平均價格,也就是我們的房子大致的價格了?。

二、模型的評估

判斷預測的值準不準!

將數據集進行切分,分成一個訓練集(訓練)和測試集(衡量效果)。

1、首先制定好訓練集和測試集

dc_listings.drop('distance',axis=1) ? train_df = dc_listings.copy().iloc[:2792] test_df = dc_listings.copy().iloc[2792:]

2、基于單變量預測價格

只算絕對值。

def predict_price(new_listing_value,feature_column):temp_df = train_dftemp_df['distance'] = np.abs(dc_listings[feature_column] - new_listing_value)temp_df = temp_df.sort_values('distance')knn_5 = temp_df.price.iloc[:5]predicted_price = knn_5.mean()return(predicted_price) test_df['predicted_price'] = test_df.accommodates.apply(predict_price,feature_column='accommodates')

這樣我們就得到了測試集中,所有房子的價格了。

3、進行衡量

計算root mean squared error (RMSE)均方根誤差

test_df['squared_error'] = (test_df['predicted_price'] - test_df['price'])**(2) mse = test_df['squared_error'].mean() rmse = mse ** (1/2) rmse

?現在我們得到了對于一個變量的模型評估得分(越低越好)

三、數據預處理

不同的變量效果會不會不同呢?

for feature in ['accommodates','bedrooms','bathrooms','number_of_reviews']:#test_df['predicted_price'] = test_df.accommodates.apply(predict_price,feature_column=feature)test_df['predicted_price'] = test_df[feature].apply(predict_price,feature_column=feature)test_df['squared_error'] = (test_df['predicted_price'] - test_df['price'])**(2)mse = test_df['squared_error'].mean()rmse = mse ** (1/2)print("RMSE for the {} column: {}".format(feature,rmse))

看起來結果差異挺大,接下來綜合利用所有的信息來一起進行測試 。

當用歐氏距離進行評估時,有些特征數據取值較大,有些特征數據取值較小。?

由于特征值不同,導致在數值上有較大和較小的差異。需要對數據進行預處理。

特征數據預處理——標準化與歸一化

  • 標準化

對原始數據進行處理,進行standardization(或者叫做Z-score normalization)

要求:均值和標準差

轉換公式如下:

意義:如果特征值之間的數值差異太大,那么更新的結果肯定會產生較大的差異。在最開始的時候,我們認為特征之間的重要程度是一樣的,因此預處理的工作必須做!!

參數更新:

  • 歸一化

Min-Max scalling(或者叫“normalization”,也就是我們常說的0-1歸一化)

處理后的所有特征的值都會被壓縮到0到1區間上,這樣做還可以抑制離群值對結果的影響。

歸一化的公式:

四、sklearn庫與功能

python中使用最多的一個機器學習庫。

(模塊:分類、回歸、距離、降維、模型選擇、數據預處理

API文檔:API Reference — scikit-learn 1.0.2 documentation

學習案例:Examples — scikit-learn 1.0.2 documentation

標準化和歸一化后數據分布不會發生變化,取值范圍會發生改變

import pandas as pd from sklearn.preprocessing import StandardScaler features = ['accommodates','bedrooms','bathrooms','beds','price','minimum_nights','maximum_nights','number_of_reviews']dc_listings = pd.read_csv('listings.csv')dc_listings = dc_listings[features]dc_listings['price'] = dc_listings.price.str.replace("\$|,",'').astype(float)dc_listings = dc_listings.dropna()dc_listings[features] = StandardScaler().fit_transform(dc_listings[features])normalized_listings = dc_listingsprint(dc_listings.shape)normalized_listings.head()

?排除了大的數值和小的數值之間從差異。

五、多變量KNN模型

1、多變量距離的計算

scipy中已經有現成的距離的計算工具了?

from scipy.spatial import distancefirst_listing = normalized_listings.iloc[0][['accommodates', 'bathrooms']] fifth_listing = normalized_listings.iloc[20][['accommodates', 'bathrooms']] first_fifth_distance = distance.euclidean(first_listing, fifth_listing) first_fifth_distance

2、多變量KNN模型?

3、使用Sklearn來完成KNN?

?1、導入需要使用的模塊;對KNN模型進行實例化;.fit:進行模型的訓練;預測測試集之后的結果。

from sklearn.neighbors import KNeighborsRegressor cols = ['accommodates','bedrooms'] knn = KNeighborsRegressor(n_neighbors=20) knn.fit(norm_train_df[cols], norm_train_df['price']) two_features_predictions = knn.predict(norm_test_df[cols])

2、 計算RMSE結果 0.813735533525

from sklearn.metrics import mean_squared_errortwo_features_mse = mean_squared_error(norm_test_df['price'], two_features_predictions) two_features_rmse = two_features_mse ** (1/2) print(two_features_rmse)

4、加入更多的特征

knn = KNeighborsRegressor()cols = ['accommodates','bedrooms','bathrooms','beds','minimum_nights','maximum_nights','number_of_reviews']knn.fit(norm_train_df[cols], norm_train_df['price']) four_features_predictions = knn.predict(norm_test_df[cols]) four_features_mse = mean_squared_error(norm_test_df['price'], four_features_predictions) four_features_rmse = four_features_mse ** (1/2) four_features_rmse

K近鄰不適用數據量大時。

總結

以上是生活随笔為你收集整理的唐宇迪机器学习笔记5:K近邻算法实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。