目录
4.classification_report (每个类别精确率与召回率)
一。k-近邻算法的定义
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
二。k近邻算法实例-预测入住位置
from sklearn.model_selection import train_test_split,GridSearchCV#train_test_split是用来划分训练和测试数据的;GridSearchCV是超参数搜索-网格搜索
from sklearn.neighbors import KNeighborsClassifier#k—近邻算法
import pandas as pd
from sklearn.preprocessing import StandardScaler#标准化
def knncls():
"""k-近邻预测签到位置"""
#读取数据
data = pd.read_csv("./train.csv")
#处理数据
data = data.query("x > 1.0 & x < 1.25 & y>2.5&y<2.75")#query用于筛选数据
time_value=pd.to_datetime(data["time"],unit="s")#to_datetime用于设置为时间格式
print(time_value)
time_value=pd.DatetimeIndex(time_value)#转化为了字典的格式
data["day"]=time_value.day
data["hour"]=time_value.hour
data["weakday"] = time_value.weekday
data=data.drop(["time"],axis=1)#drop中axis=1表示列
print(data)
place_count=data.groupby("place_id").count()#把签到数量少于n个的目标位置删除
tf=place_count[place_count.row_id>3].reset_index()#reset_index用索引重置生成一个新的DataFrame或Series。当索引需要被视为列,或者索引没有意义,需要在另一个操作之前重置为默认值时。
data=data[data["place_id"].isin(tf.place_id)]
y=data["place_id"]#目标值
x=data.drop(["place_id","row_id"],axis=1)#特征值
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)#train_test_split是用来划分训练和测试数据的
#特征工程(标准化)对训练集和测试集的特征值进行标准化
std=StandardScaler()
x_train=std.fit_transform(x_train)#对x_train进行标准化处理
x_test=std.transform(x_test)#对x_test进行标准化处理
#进行算法流程
# knn=KNeighborsClassifier(n_neighbors=5)
knn=KNeighborsClassifier()
# knn.fit(x_train,y_train)#把训练集数据输入,k-近邻算法无需训练
# y_predict=knn.predict(x_test)
# print("预测的目标签到位置为:",y_predict)
# print("预测的准确率:",knn.score(x_test,y_test))#得出准确率
param={"n_neighbors":[3,5,10]}
gc=GridSearchCV(knn,param_grid=param,cv=2)#param_grid为估计器参数,cv为指定几折交叉验证
gc.fit(x_train, y_train)#向网格搜索输入训练数据
print("在测试集上的准确率:",gc.score(x_test,y_test))#准确率,交叉验证时输入的是train跟test没有关系
print("在训练集上的准确率:", gc.score(x_train, y_train))
print("在交叉验证当中最好的结果:",gc.best_score_)
print("选择最好的模型是:",gc.best_estimator_)
print("每个超参数每次交叉验证的结果:",gc.cv_results_)
return None
if __name__=="__main__":
knncls()
三。k-临近算法优缺点
•优点:
•简单,易于理解,易于实现,无需估计参数,无需训练
•缺点:
•懒惰算法,对测试样本分类时的计算量大,内存开销大
•必须指定K值,K值选择不当则分类精度不能保证
•使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试
四。精确率与召回率
1.精确率
预测结果为正例样本中真实为正例的比例(查得准)
2.召回率
真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)
3.F1-score
反映了模型的稳健型
4.classification_report (每个类别精确率与召回率)
•sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
•y_true:真实目标值
•y_pred:估计器预测目标值
•target_names:目标类别名称
•return:每个类别精确率与召回率
五。朴素贝叶斯-贝叶斯公式
P(C│W)=(P(W│C)P(C))/(P(W))
w为给定文档的特征值(频数统计,预测文档提供),c为文档类别
公式分为三个部分:
•P(C):每个文档类别的概率(某文档类别词数/总文档词数)
•P(W│C):给定类别下特征(被预测文档中出现的词)的概率
•P(F1,F2,…) 预测文档中每个词的概率
六。拉普拉斯平滑系数
P(F1│C)=(Ni+α)/(N+αm)
α为指定的系数一般为1,m为训练文档中统计出的特征词个数
七。朴素贝叶斯算法案例
•sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
•朴素贝叶斯分类
•alpha:拉普拉斯平滑系数
from sklearn.datasets import fetch_20newsgroups
from sklearn.metrics import classification_report#计算每个类别的精确率与召回率
from sklearn.model_selection import train_test_split#分割数据集
from sklearn.feature_extraction.text import TfidfVectorizer#特征抽取,中重要性
from sklearn.naive_bayes import MultinomialNB#朴素贝叶斯算法
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()
x_train=tf.fit_transform(x_train)#对x_train进行特征抽取,根据词的重要性;
# print(tf.get_feature_names())
x_test=tf.transform(x_test)#对x_test进行特征抽取,根据词的重要性;
mlt=MultinomialNB(alpha=1.0)
# print(x_train.toarray())
# print(x_test.toarray())
# print(y_train)
mlt.fit(x_train,y_train)
y_predict=mlt.predict(x_test)
# print("预测的文章类别为:",y_predict)
print("准确率为:",mlt.score(x_test,y_test))
print("每个类别的精确率与召回率:","\n",classification_report(y_test,y_predict,target_names=news.target_names))
print("*"*100)
print(news.target_names)
print(news.target)
return None
if __name__=="__main__":
naviebayes()
/Users/lichengxiang/opt/anaconda3/bin/python /Users/lichengxiang/Desktop/python/机器学习/朴素贝叶斯算法.py
准确率为: 0.8514431239388794
每个类别的精确率与召回率:
precision recall f1-score support
alt.atheism 0.90 0.77 0.83 203
comp.graphics 0.88 0.73 0.80 241
comp.os.ms-windows.misc 0.82 0.84 0.83 244
comp.sys.ibm.pc.hardware 0.80 0.79 0.79 271
comp.sys.mac.hardware 0.83 0.91 0.87 229
comp.windows.x 0.93 0.81 0.87 261
misc.forsale 0.93 0.68 0.79 247
rec.autos 0.93 0.94 0.94 247
rec.motorcycles 0.92 0.97 0.94 228
rec.sport.baseball 0.96 0.96 0.96 254
rec.sport.hockey 0.97 0.98 0.97 264
sci.crypt 0.68 0.98 0.80 228
sci.electronics 0.92 0.78 0.85 259
sci.med 0.99 0.89 0.94 263
sci.space 0.85 0.97 0.91 225
soc.religion.christian 0.58 0.98 0.73 248
talk.politics.guns 0.73 0.97 0.84 218
talk.politics.mideast 0.93 0.97 0.95 244
talk.politics.misc 0.99 0.58 0.73 195
talk.religion.misc 0.97 0.23 0.37 143
accuracy 0.85 4712
macro avg 0.88 0.84 0.84 4712
weighted avg 0.88 0.85 0.85 4712
****************************************************************************************************
['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']
[10 3 17 ... 3 1 7]
进程已结束,退出代码0
八。朴素贝叶斯分类优缺点
•优点:
•朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
•对缺失数据不太敏感,算法也比较简单,常用于文本分类。
•分类准确度高,速度快
•缺点:
•需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
九。网格搜索及交叉验证
1.交叉验证
为了让被评估的模型更加准确可信
交叉验证:将拿到的数据,分为训练和验证集。例如将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证。
2.超参数搜索-网格搜索
通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
•sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
•对估计器的指定参数值进行详尽搜索
•estimator:估计器对象
•param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
•cv:指定几折交叉验证
•fit:输入训练数据
•score:准确率
•结果分析:
•best_score_:在交叉验证中测试的最好结果
•best_estimator_:最好的参数模型
•cv_results_:每次交叉验证后的测试集准确率结果和训练集准确率结果