机器学习入门-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 分类 分类计数预测的数据对象是离散的.如短信是否为垃圾短信,用 ...
随机推荐
- smarty 学习 ——smarty 开发环境配置
smarty 对于开发的便利性不用多说了,直接进行开发环境的配置. 1.下载smarty 开发包 直接在官网进行下载即可 2.引用开发核心库 将libs文件中的东西拷贝到工程. smarty.clas ...
- position 属性值:relative 与 absolute 区别
absolute 能让元素 inline-block 化: 例如一个div标签默认宽度是100%显示的,但是一旦被absolute属性缠上,则100%默认宽度就会变成自适应内部元素的宽度. float ...
- jcFlexible.js的小Demo
;(function(win, lib) { var doc = win.document; var docEl = doc.documentElement; var metaEl = doc.que ...
- npm使用入门(package.json)
npm使用入门 crazygit 关注 2017.03.10 18:31 字数 1773 阅读 1617评论 0喜欢 10 NPM是什么 npm npm makes it easy for JavaS ...
- ubuntu修改Bash命令行提示符
用户通过远程登陆,初始的PS1为\s-\v\$, bash为/bin/bash,然后先后执行/etc/profile和~/.bash_profile中的命令. /etc/profile文件中调用执行/ ...
- onload属性使用方法
onload事件属性是页面的图片文字等全部加载完毕后执行的事件 window.onload=fun1;function fun1(){ document.getElementsByTagName ...
- 术语-服务:PaaS
ylbtech-术语-服务:PaaS PaaS是Platform-as-a-Service的缩写,意思是平台即服务. 把服务器平台作为一种服务提供的商业模式.通过网络进行程序提供的服务称之为SaaS( ...
- 杂项:GitHub
ylbtech-杂项:GitHub gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub. gitHub于2008年4月10日正式上线, ...
- [转]JSON.stringify 详解
来自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify J ...
- selenium Java-1 配置
1.使用intellij新建一个maven项目,名字自定.在pom中写入selenium的依赖.其他依赖也添加到该文件中. [maven selenium依赖](http://mvnreposit ...