唐宇迪机器学习笔记5:K近邻算法实战
2022/3/21 1:28:10
本文主要是介绍唐宇迪机器学习笔记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 pd 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] 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 np our_acc_value = 3 dc_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_df temp_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_listings print(dc_listings.shape) normalized_listings.head()
排除了大的数值和小的数值之间从差异。
五、多变量KNN模型
1、多变量距离的计算
scipy中已经有现成的距离的计算工具了
from scipy.spatial import distance first_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_error two_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近邻算法实战的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-28机器学习资料入门指南
- 2024-10-25机器学习开发的几大威胁及解决之道
- 2024-10-24以下是五个必备的MLOps (机器学习运维)工具,帮助提升你的生产效率 ??
- 2024-10-15如何选择最佳的机器学习部署策略:云 vs. 边缘
- 2024-10-12从软件工程师转行成为机器学习工程师
- 2024-09-262024年机器学习路线图:精通之路步步为营指南
- 2024-09-13机器学习教程:初学者指南
- 2024-08-07从入门到精通:全面解析机器学习基础与实践
- 2024-01-24手把手教你使用MDK仿真调试
- 2024-01-10基于“小数据”的机器学习