唐宇迪机器学习笔记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_price5、得到了平均價格,也就是我們的房子大致的價格了?。
二、模型的評估
判斷預測的值準不準!
將數據集進行切分,分成一個訓練集(訓練)和測試集(衡量效果)。
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_distance2、多變量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_rmseK近鄰不適用數據量大時。
總結
以上是生活随笔為你收集整理的唐宇迪机器学习笔记5:K近邻算法实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mpvue v-html 代替方法 使用
- 下一篇: 面向对象编程——获取对象信息(五)