分类算法:k-近邻算法
通过“邻居”来判断目标值的类型
定义:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,该样本也属于这个类别
KNN最早是由Cover与Hart提出
欧式距离:
两个样本的距离可以通过如下公式计算
比较样本之间特征之间的远近,相似的样本也就是特征值之间的值相近值
k-近邻需要进行标准化处理,k的取值大小会影响结果
API: sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
实例:预测入住位置
row_id、时间戳(增加特征:年、月、日、时、分、秒、周 看效果怎么样)、xy、准确性、目标值
分类:
特征值:x,y坐标、定位准确性、时间
目标值:入住位置的id
处理:
1、数据缩小:0<x<10,0<y<10 (节省时间)
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已经发生条件下的发生概率
最常用在文档分类,前提是条件独立
多个条件的情况使用贝叶斯公式:
当训练数据是出现0的情况是不合适的
所以需要使用拉普拉斯平滑系数:
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
混淆矩阵:
在分类任务下,预测结果与正确标记之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
模型选择与调优:
交叉验证:
目的:为了让被评估的模型更加准确可信
原来的训练集会分成两部分:训练集和验证集(和测试集没有关系)
由验证集得出一个准确率,所有数据分成n等分,n等分中有若干等分为训练集剩下为验证集,得出一个模型的准确率,然后继续随机组合,若干份为训练集其他为验证集进行建模型得出准确率,每种组合就会得出一个模型和准确率,然后求出所有模型准确率的平均值作为最终结果。
网格搜索:
调参数:k-近邻:超参数
又称为超参数搜索
通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的k值),叫做超参数。但是手动比较繁杂,所以需要对模型预设几种超参数组合,每组超参数都采用交叉验证来进行评估,最后选出最优参数组合尽力建立模型。
如果一个算法中有两个超参数,需要进行超参数两两组合然后进行交叉验证
API:sklearn.model_selection.GridSearchCV