机器学习入门-Knn算法
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算法的更多相关文章
- JavaScript机器学习之KNN算法
译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...
- 机器学习之KNN算法
1 KNN算法 1.1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属 ...
- 机器学习:k-NN算法(也叫k近邻算法)
一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...
- 菜鸟之路——机器学习之KNN算法个人理解及Python实现
KNN(K Nearest Neighbor) 还是先记几个关键公式 距离:一般用Euclidean distance E(x,y)√∑(xi-yi)2 .名字这么高大上,就是初中学的两点间的距离 ...
- 机器学习笔记--KNN算法2-实战部分
本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...
- 机器学习笔记--KNN算法1
前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...
- 初识机器学习之kNN算法
k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本.然后基于这k个“邻居”的 ...
- 机器学习之KNN算法(分类)
KNN算法是解决分类问题的最简单的算法.同时也是最常用的算法.KNN算法也可以称作k近邻算法,是指K个最近的数据集,属于监督学习算法. 开发流程: 1.加载数据,加载成特征矩阵X与目标向量Y. 2.给 ...
- 机器学习入门KNN近邻算法(一)
1 机器学习处理流程: 2 机器学习分类: 有监督学习 主要用于决策支持,它利用有标识的历史数据进行训练,以实现对新数据的表示的预测 1 分类 分类计数预测的数据对象是离散的.如短信是否为垃圾短信,用 ...
随机推荐
- Javascript 在严格模式下禁止指向 this
如下代码, f() 输出的是 false,而 f2() 输出的是 true. 这是因为 f2 在严格模式下禁止 this 指向全局,所以 this 是 undefined, !this 当然是 tru ...
- 使用 mysqldump 备份时的一些参数
因为还没有用到 ThinkPHP 的迁移组件,暂时使用 mysqldump 来备份,并版本控制. 有几个参数需要用到. --skip-dump-date 不要完成时间. --skip-extended ...
- ActiveMQ生产者和消费者优化策略
一.生产者优化策略 默认情况下,ActiveMQ服务端认为生产者端发送的是PERSISTENT Message.所以如果要发送NON_PERSISTENT Message,那么生产者端就要明确指定. ...
- JUC集合之 CopyOnWriteArraySet
CopyOnWriteArraySet介绍 它是线程安全的无序的集合,可以将它理解成线程安全的HashSet.有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类A ...
- Android自动化框架 模拟操作 模拟测试
转自:http://bbs2.c114.net/home.php?mod=space&uid=1025779&do=blog&id=5322 几种常见的Android自动化测试 ...
- antd在线换肤定制功能
最近react项目,用的antd框架,然后看见他的antdPro例子里面有个定制功能很帅,老大说做,那就做吧,鼓捣了一晚终于实现了. 先看预览效果吧 css换肤 入行前端的时候经常看鱼哥(张鑫旭)的博 ...
- 【Oracle学习笔记-1】Win7下安装Oracle 10g
源程序获取 从Oracle的官网上下载Oracle 10g: 10203_vista_w2k8_x86_production_db.zip:==>服务器(必须) 10203_vista_w2k8 ...
- bzoj 4449: [Neerc2015]Distance on Triangulation
Description 给定一个凸n边形,以及它的三角剖分.再给定q个询问,每个询问是一对凸多边行上的顶点(a,b),问点a最少经过多少条边(可以是多边形上的边,也可以是剖分上的边)可以到达点b. I ...
- 去掉chrome浏览器中input或textarea在得到焦点时出现黄色边框的方法
此文来源网络,我转载的原文里的图显示“该图片仅限百度用户内部交流使用”,我估计这篇文章是从百度空间抄过来的,该作者没保留原文地址.所以我在这里也没保留抄袭文章的地址. chrome浏览器不管对于开发者 ...
- display:inline block inline-block 的区别
原文地址:http://blog.csdn.net/jly036/article/details/5506182 display:block就是将元素显示为块级元素. block元素的特点是: 总是在 ...