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. 树的遍历算法-只有一个变量T-递归和非递归

    void PostOrderTraverse(BTNode *T) { //就用到了一个变量T if(T==NULL) return; PostOrderTraverse(T->lchild); ...

  2. visual studio 2014 新特性

    原文如下: Visual Studio "14" CTP Today, we are making available a first community technology p ...

  3. SQL Server中如何实现遍历表的记录

    SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录. 但游标在实际的开发中都不推荐使用. 我们知道还可以借助临时表或表变 ...

  4. NSDate 时间加减

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/pearlhuzhu/article/details/26227393 NSDate有个类别,例如以下 ...

  5. 声明变量(Declared Variable)和非声明变量(Undeclared Variable)的区别

    声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的. 声明变量在任何代码执行前创建,而非声明变量只有在执行赋值操作的时候才会被创建. 声明变量是它所在上下文环境的不可配置属性(non- ...

  6. bzoj 4772 显而易见的数论——拆分数(五边形数定理)+线性筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4772 题解:https://blog.csdn.net/Dream_Lolita/artic ...

  7. Java数组初始

    首先要清楚数组变量与数组对象的概念.数组变量是一个引用变量,可以指向数组对象. int[] a = new int[]{7, 8, 9};        a是数组变量,指向有new创建的数组对象. 数 ...

  8. Vue2.x整合百度地图JavaScript方案

    代码很整合很简单,主要记录操作思路,注意回调百度地图api的回调函数 @/utils/map.js let Map = { BaiDuMap(ak) { return new Promise(func ...

  9. C# 爬取网页上的数据

    最近工作中需求定时爬取不同城市每天的温度.其实就是通过编程的方法去抓取不同网站网页进行分析筛选的过程..NET提供了很多类去访问并获得远程网页的数据,比如WebClient类和HttpWebReque ...

  10. Linux下解压缩命令

    1. tar格式 解包:[*******]$ tar xvf FileName.tar 打包[---]:[*******]$ tar cvf FileName.tar DirName(注:tar是打包 ...