分类模型评估
1.准确率:.score()
2.混淆矩阵
混淆矩阵
1.召回率:真实为正例的样本中,预测结果为正例的比例(查的全不全,对正样本的区分能力)(tp)/(tp+fn)
2.精确率:预测结果为正的样本中,真实为正例的比例(tp)/(tp+fp)
正例 | 负例 | |
---|---|---|
正例 | 真正例tp | 伪反例FN |
负例 | 伪正例FP | 真反例TN |
预测结果例子:100个动物是猫还是狗
其中20个是猫
是猫 | 不是猫 | |
---|---|---|
猫 | 18 | 2 |
不是猫 | 8 | 72 |
F1-score 反应了模型的稳健性
F1=(2tp)/(2tp+fn+fp)=(2PrecisionRecall)/(Precision+Recall)
分类模型评估API
sklearn.metrics.classification_report(y_true,y_pred,targe_name=None)
- y_true-真实目标值
- y_pred-估计器预测目标值
- targe_name=None–目标类别名称
- return–每个类别精准率和召回率
模型选择与调优
- 交叉验证-----为了让模型更加准确可信
- 网格搜索
交叉验证
会把训练集分成2部分:
- 训练集:
- 验证集:
将所有的数据分成n等分:
如下 称为 4折交叉验证
验证 | 训练集 | 验证集 | 训练集 -->得出准确率模型1
训练集 | 验证 | 验证集 | 训练集 -->得出准确率模型2
训练集 | 训练集 | 验证 | 训练集 -->得出准确率模型3
训练集 | 训练集 | 验证集 | 验证 -->得出准确率模型4
求平均值模型结果85%
一般用10折交叉验证
网格搜索–>如调参数 k-近邻
调k 达到目的最好
- 当有2个参数的时候,进行22组合
例:a[2,3,4,5,8],b[20,70,2] 共15次 比如说 2,20 一次,然后你懂的
- 超参数网格搜索 api—sklearn.model_selection.GridSearchCV
sklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None)
- estimator ----估计器对象
- param_grid=None----估计器参数
- cv-----几折
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# def navi():
# """
# 贝叶斯
# :return
# """
# news = fetch_20newsgroups(subset='all')
# # 进行数据分割
# x_train, x_test, y_train, y_test = train_test_split(news.data, news.traget, test_size=0.25)
#
# # 对数据集进行特征抽取
# tf = TfidfVectorizer()
#
# # 以训练集当中的词的列表进行每篇文章重要性的统计
# x_train = tf.fit_transform(x_train)
# print(tf.get_feature_names())
#
# x_test = tf.transfotm(x_test)
#
# # 进行朴素贝叶斯算法
# mlt = MultinomialNB(alpha=1.0)
# print(x_train)
# mlt.fit(x_train, y_train)# fit 给训练数据,建立一个模型,数据模型之类的
# y_predict = mlt.predict(x_test)# predict 测试数据
# print("预测的文章类别:",y_predict)
#
# # 得出准确率
# print('准确率:',mlt.score(x_test, y_test))
#
# print("每个类别的精确率和召回率:",classification_report(y_test, y_predict, target_names=news.target_name ))
# # target_names=news.target_name 文章类别字符串,科技,娱乐啊
# return None
def knncls():
"""
K-近邻预测用户签到位置
:return:None
"""
# 读取数据
data = pd.read_csv("./bate/train.csv")
# print(data.head(10))
# 处理数据
# 1、缩小数据,查询数据晒讯
data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")
# 处理时间的数据
time_value = pd.to_datetime(data['time'], unit='s')
#print(time_value)
# 把日期格式转换成 字典格式
time_value = pd.DatetimeIndex(time_value)
# 构造一些特征
data['day'] = time_value.day
data['hour'] = time_value.hour
data['weekday'] = time_value.weekday
# 把时间戳特征删除
data = data.drop(['time'], axis=1)
# print(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)]
# 取出数据当中的特征值和目标值
y = data['place_id']
x = data.drop(['place_id'], axis=1)
# 进行数据的分割训练集合测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 特征工程(标准化)
std = StandardScaler()
# 对测试集和训练集的特征值进行标准化
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 进行算法流程 # 超参数
knn = KNeighborsClassifier()
# # fit, predict,score
# knn.fit(x_train, y_train)
#
# # 得出预测结果
# 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)
gc.fit(x_train, y_train)
# 预测准确率
print("在测试集上准确率:", gc.score(x_test, y_test))
print("在交叉验证当中最好的结果:", gc.best_score_)
print("选择最好的模型是:", gc.best_estimator_)
print("每个超参数每次交叉验证的结果:", gc.cv_results_)
return None
if __name__ == "__main__":
knncls()
在测试集上准确率: 0.4340425531914894
在交叉验证当中最好的结果: 0.3925756620428752
选择最好的模型是: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=10, p=2,
weights='uniform')
每个超参数每次交叉验证的结果: {'mean_fit_time': array([0.00557303, 0.00503707, 0.00490749]), 'std_fit_time': array([5.55753708e-04, 7.79628754e-05, 2.46763229e-05]), 'mean_score_time': array([0.38887048, 0.45110786, 0.60493946]), 'std_score_time': array([0.02635264, 0.04554093, 0.08051562]), 'param_n_neighbors': masked_array(data=[3, 5, 10],
mask=[False, False, False],
fill_value='?',
dtype=object), 'params': [{'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 10}], 'split0_test_score': array([0.34725725, 0.3712169 , 0.39186633]), 'split1_test_score': array([0.35545397, 0.37342371, 0.39328499]), 'mean_test_score': array([0.35135561, 0.3723203 , 0.39257566]), 'std_test_score': array([0.00409836, 0.0011034 , 0.00070933]), 'rank_test_score': array([3, 2, 1], dtype=int32)}
Process finished with exit code 0