小白学python-k-近邻算法

分类算法:k-近邻算法

通过“邻居”来判断目标值的类型

定义:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,该样本也属于这个类别

KNN最早是由Cover与Hart提出

欧式距离:

两个样本的距离可以通过如下公式计算

比较样本之间特征之间的远近,相似的样本也就是特征值之间的值相近值

k-近邻需要进行标准化处理,k的取值大小会影响结果

API: sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

实例:预测入住位置

row_id、时间戳(增加特征:年、月、日、时、分、秒、周   看效果怎么样)、xy、准确性、目标值

分类:

特征值:x,y坐标、定位准确性、时间

目标值:入住位置的id

处理:

1、数据缩小:0

data.query():查询数据()加上条件

2、时间戳进行处理(看效果):转换成年、月、日、周、时、分、秒,组合后当做新的特征

time_value = pd.to_datatime(data[time],unit=" ")(time_value不能同时获取年月日)

把日期格式转换成字典数

time_value = pd.DatatimeIndex(time_value)   此时time_value的时分秒可以单独获取

构造一些特征:

data["day"] = time_value.day

data["hour"] = time_value.hour

把时间戳特征删除 :

data = data.drop(['time'], axis = 1)     (在sklearn中1表示列)

此时data中没有时间戳的特征值

把签到数量少于n个目标位置删除:

place_count = data.groupby('place_id').count()
tf = place_count[place_count.row_id > 3].reset_index()

data = data[data['place_id'].isin(tf.place_id)]

取出数据中的特征值和目标值

进行数据的分割训练集合测试集

3、入住的位置需要进行分类,入住位置太多则会降低预测的准确性,少于指定签到到人数的位置进行删除(也可以从其他的角度来考虑)

k-近邻算法的优缺点:

优点:简单,易于实现、易于理解,无需估计参数、无需训练

缺点:

1、懒惰算法:计算量大,内存开销大

2、必须指定k值

k值问题:

k值取很小:受异常点影响较大

k值取很大:容易受k值数量的类别波动

3、使用场景:小数据场景

性能问题:

比较复杂,耗时

分类算法:朴素贝叶斯

概率的基础:

定义:一件事情发生的可能性

联合概率:包含多个条件,且所有条件同时成立的概率

条件概率:事件A在另一个事件B已经发生条件下的发生概率

最常用在文档分类,前提是条件独立

多个条件的情况使用贝叶斯公式:

小白学python-k-近邻算法_第1张图片

小白学python-k-近邻算法_第2张图片

当训练数据是出现0的情况是不合适的

所以需要使用拉普拉斯平滑系数:

小白学python-k-近邻算法_第3张图片

API:sklearn.naive_bayes.MultinomialNB

案例分析:

流程:

1、加载新闻数据,并进行分割

2、生成文章特征词

3、朴素贝叶斯estimator流程进行评估

from sklearn.datasets import load_iris
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import  train_test_split
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
import numpy as np
def naviebayes():
    news = fetch_20newsgroups(subset="all")
    #对数据进行分割
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
    #对数据集新型特征抽取
    tf = TfidfVectorizer()
    #以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
    x_train = tf.fit_transform(x_train)
    print(tf.get_feature_names())
    x_test = tf.transform(x_test)
    #进行朴素贝叶斯算法的预测
    mlt = MultinomialNB(alpha=1.0)
    print(x_train.toarray())
    mlt.fit(x_train,y_train)
    y_predict = mlt.predict(x_test)
    print("预测的文章类别为:",y_predict)
    #得出准确率
    print("准确率为:",mlt.score(x_test,y_test))
    return None
if __name__ == "__main__":
    naviebayes()

优点:

1、朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率

2、对缺失数据不太敏感,算法也比较简单,常用于文本分类

3、分类准确度高,速度快

缺点:

需要知道先验概率,因此在某些时候会由于假设的先验模型的原因导致的预测效果不佳

训练集当中去进行统计次的工作,会对结果造成干扰

神经网络会比朴素贝叶斯效果要好

分类模型评估标准:

准确率:

精确率:预测结果为正例样本中真实为正例的比例(差的准)

召回率:真实为正例样本中预测结果为正例的比例(查的全,对正样本的区分能力)

其他分类标准:F1-score

API:sklear.metrics.classification_report

小白学python-k-近邻算法_第4张图片

混淆矩阵:

在分类任务下,预测结果与正确标记之间存在四种不同的组合,构成混淆矩阵(适用于多分类)

模型选择与调优:

交叉验证:

目的:为了让被评估的模型更加准确可信

原来的训练集会分成两部分:训练集和验证集(和测试集没有关系)

由验证集得出一个准确率,所有数据分成n等分,n等分中有若干等分为训练集剩下为验证集,得出一个模型的准确率,然后继续随机组合,若干份为训练集其他为验证集进行建模型得出准确率,每种组合就会得出一个模型和准确率,然后求出所有模型准确率的平均值作为最终结果。

网格搜索:

调参数:k-近邻:超参数

又称为超参数搜索

通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的k值),叫做超参数。但是手动比较繁杂,所以需要对模型预设几种超参数组合,每组超参数都采用交叉验证来进行评估,最后选出最优参数组合尽力建立模型。

如果一个算法中有两个超参数,需要进行超参数两两组合然后进行交叉验证

API:sklearn.model_selection.GridSearchCV

小白学python-k-近邻算法_第5张图片

你可能感兴趣的:(python,算法,机器学习)