knn算法不需要进行训练, 耗时,适用于多标签分类情况

1. 将输入的单个测试数据与每一个训练数据依据特征做一个欧式距离、

2. 将求得的欧式距离进行降序排序,取前n_个

3. 计算这前n_个的y值的平均或者(类别),获得测试数据的预测值

4.根据测试数据的实际值和测试数据的预测值计算当前的rmse,判断该方法的好坏

使用AIRbob的房子的特征与房价做演示:

演示1.首先使用accommodates属性对一个数据做演示,采用的距离是绝对值距离

import pandas as pd
import numpy as np df_listings = pd.read_csv('listings.csv')
# 选取部分特征
features = ['accommodates', 'bedrooms', 'bathrooms', 'beds', 'price', 'minimum_nights', 'maximum_nights', 'number_of_reviews']
# 选取部分特征重新组合
df_listings = df_listings[features]
# 先只对accommodates进行操作
new_accomodates = 3 # 有一个房子的可容纳住房为3
df_listings['distance'] = np.abs(df_listings['accommodates'] - new_accomodates)
# 接下来对df_listings按照'distance'进行排序操作.value_counts()统计个数, sort_index() 进行排序
df_listings.distance.value_counts().sort_index()
# 使用洗牌操作,重新赋值
df_listings = df_listings.sample(frac=1, random_state=0)
# 重新继续排序
df_listings = df_listings.sort_values('distance')
print(df_listings.price.head())
# 由于价格是$150 ,我们需要将其转换为float类型
df_listings['price'] = df_listings['price'].str.replace('\$|,', "").astype(float)
# 取前5个数据,求价格的平均值
price_mean_5 = df_listings['price'].iloc[:5].mean()
print(price_mean_5)

演示2 将住房数据分为训练集和测试集, 使用单个特征进行测试

df_listings = df_listings.drop('distance', axis=1)
# 将数据进行拆分
train_df = df_listings[:2792]
test_df = df_listings[2792:]
# 定义预测函数
def predict_price(test_content, feature_name):
temp_df = train_df
temp_df['distance'] = np.abs(test_content - temp_df[feature_name])
# 根据distance进行排序
temp_df = temp_df.sort_values('distance')
price_mean_5 = temp_df.price.iloc[:5].mean()
return price_mean_5
cols = ['accommodates']
# 这个.apply相当于将每一个数据输入,参数为函数, feature_name为第二个参数
test_df['predict_price'] = test_df[cols[0]].apply(predict_price, feature_name = 'accommodates')
print(test_df['predict_price'])
# 计算rmse
mse = ((test_df['predict_price'] - test_df['price']) ** 2).mean()
rmse = mse ** (1 / 2)
print(rmse) # 分别比较其他属性单个的区别
for feature in ['accommodates', 'bedrooms', 'bathrooms', 'number_of_reviews']:
test_df['predict_price'] = test_df[feature].apply(predict_price, feature_name=feature)
print(test_df['predict_price'])
# 计算rmse
mse = ((test_df['predict_price'] - test_df['price']) ** 2).mean()
rmse = mse ** (1 / 2)
print('where{}:{}'.format(feature, rmse))

演示3:在上面的基础上,添加数据标准化(zeros)操作,标准化的意思是先减去均值,然后再除于标准差。同时引入多变量操作

使用的包有: from sklearn.mean_squred_error  用于求平均值
                      from scipy.spatial import distance 用于求欧式距离

from sklearn.processing import  StandardScaler  用于进行标准化操作

from sklearn.preprocessing import StandardScaler
df_listings = pd.read_csv('listings.csv')
# 选取部分特征
features = ['accommodates', 'bedrooms', 'bathrooms', 'beds', 'price', 'minimum_nights', 'maximum_nights', 'number_of_reviews']
# 选取部分特征重新组合
df_listings = df_listings[features]
# 对价格进行处理
df_listings['price'] = df_listings['price'].str.replace('\$|,', "").astype(float)
# 去除有缺失值的行
df_listings = df_listings.dropna() # 对数据进行标准化的操作
df_listings[features] = StandardScaler().fit_transform(df_listings[features]) # 进行数据拆分
train_df = df_listings[:2792]
test_df = df_listings[2792:] # 使用欧式距离构成距离
from scipy.spatial import distance
from sklearn.metrics import mean_squared_error
# 构造多变量函数
def predict_price(new_content, feature_name):
temp_df = train_df.copy()
temp_df['distance'] = distance.cdist(temp_df[feature_name], [new_content[feature_name]])
temp_df = temp_df.sort_values('distance')
price_mean_5 = temp_df.price.iloc[:5].mean()
return price_mean_5
# 选取其中的两个变量
cols = ['accommodates', 'bathrooms']
test_df['predict_price'] = test_df.apply(predict_price, feature_name=cols, axis=1)
mse = mean_squared_error(test_df['predict_price'], test_df['price'])
rmse = mse ** (1 / 2)
print(rmse)

演示4 使用sklearn附带的knn进行运算

from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error df_listings = pd.read_csv('listings.csv')
# 选取部分特征
features = ['accommodates', 'bedrooms', 'bathrooms', 'beds', 'price', 'minimum_nights', 'maximum_nights', 'number_of_reviews']
# 选取部分特征重新组合
df_listings = df_listings[features]
# 对价格进行处理
df_listings['price'] = df_listings['price'].str.replace('\$|,', "").astype(float)
# 去除有缺失值的行
df_listings = df_listings.dropna()
# 拆分数据
df_listings[features] = StandardScaler().fit_transform(df_listings[features])
train_df = df_listings[:2792]
test_df = df_listings[2792:]
print(test_df.head())
cols = ['accommodates', 'bathrooms']
# 实例化一个knn, n_neighbors用来调整k值
knn = KNeighborsRegressor(n_neighbors=10)
# 进行模型的训练
knn.fit(train_df[cols], train_df['price'])
# 进行模型的预测
test_df['predict_price'] = knn.predict(test_df[cols])
# 计算mse
mse = mean_squared_error(test_df['predict_price'], test_df['price'])
rmse = mse ** (1 / 2)
print(rmse) # 使用全部特征做一个比较
cols = ['accommodates', 'bedrooms', 'bathrooms', 'beds', 'minimum_nights', 'maximum_nights', 'number_of_reviews']
knn = KNeighborsRegressor(n_neighbors=10)
knn.fit(train_df[cols], train_df['price'])
test_df['predict_price'] = knn.predict(test_df[cols])
mse = mean_squared_error(test_df['predict_price'], test_df['price'])
rmse = mse ** (1 / 2)
print(rmse)

机器学习入门-Knn算法的更多相关文章

  1. JavaScript机器学习之KNN算法

    译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...

  2. 机器学习之KNN算法

    1 KNN算法 1.1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属 ...

  3. 机器学习:k-NN算法(也叫k近邻算法)

    一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...

  4. 菜鸟之路——机器学习之KNN算法个人理解及Python实现

    KNN(K Nearest Neighbor) 还是先记几个关键公式 距离:一般用Euclidean distance   E(x,y)√∑(xi-yi)2 .名字这么高大上,就是初中学的两点间的距离 ...

  5. 机器学习笔记--KNN算法2-实战部分

    本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...

  6. 机器学习笔记--KNN算法1

    前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...

  7. 初识机器学习之kNN算法

    k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本.然后基于这k个“邻居”的 ...

  8. 机器学习之KNN算法(分类)

    KNN算法是解决分类问题的最简单的算法.同时也是最常用的算法.KNN算法也可以称作k近邻算法,是指K个最近的数据集,属于监督学习算法. 开发流程: 1.加载数据,加载成特征矩阵X与目标向量Y. 2.给 ...

  9. 机器学习入门KNN近邻算法(一)

    1 机器学习处理流程: 2 机器学习分类: 有监督学习 主要用于决策支持,它利用有标识的历史数据进行训练,以实现对新数据的表示的预测 1 分类 分类计数预测的数据对象是离散的.如短信是否为垃圾短信,用 ...

随机推荐

  1. Uboot启动命令使用

    1.查看根文件系统中的内容 打断Uboot的启动,默认从SD卡启动,查看根文件系统中/boot下的内容(根文件系统在mmcblk0p1上):=> mmc rescan=> ext4ls m ...

  2. golang 自定义importpath

    golang 的包导入和其他语言有好多不一样的地方,以下是一个自定义的导入 golang 自定义导入说明 一个官方的说明 比较简单,就不翻译了,主要是说我们可以通过添加meta 数据告诉包如何进行加载 ...

  3. StreamSets SDC RPC Pipelines说明

    主要目的是进行跨pipeline 数据的通信,而不仅仅是内部pipeline 的通信,之间不同网络进行通信 一个参考图 pipeline 类型 origin destination 部署架构 使用多个 ...

  4. android 图片解码显示流程

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jingxia2008/article/details/32327699 问题来源 android 能 ...

  5. DDD领域驱动设计 ---- 系列文章

    C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建 C#进阶系列——DDD领域驱动设计初探(六):领域服务 C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用 C#进阶系 ...

  6. Javascript 正则验证带 + 号的邮箱地址

    很多邮箱地址是可以加上 + 加号为同一个邮箱地址. 比如 Gmail. 如果需要验证带 + 号的邮箱,如下: str = "65485+55@gmail.com"; documen ...

  7. TCC(Tiny C Compiler)介绍

    TCC是一个超小.超快的标准C语言编译器.她可以从这里(http://bellard.org/tcc/)下载到:注意,要下载http://download.savannah.nongnu.org/re ...

  8. HTTP协议中的长连接、短连接、长轮询、短轮询

    长连接.短连接,指的是TCP连接.长连接是为了复用TCP连接. 长轮询中,服务器如果检测到库存量没有变化的话,将会把当前请求挂起一段时间(这个时间也叫作超时时间,一般是几十秒).在这个时间里,服务器会 ...

  9. python类的继承的两种方式

    class Animal(object): """docstring for Animal""" def __init__(self, na ...

  10. wxWidgets:处理wxEVT_PAINT

    我们仍然以继承于wxFrame的MyFrame作为例子. MyFrame.h: class MyFrame : public wxFrame { ...... private: ...... void ...