机器学习#分类模型评估

分类模型评估

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–每个类别精准率和召回率

模型选择与调优

  1. 交叉验证-----为了让模型更加准确可信
  2. 网格搜索

交叉验证

会把训练集分成2部分:

  1. 训练集:
  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 一次,然后你懂的
  1. 超参数网格搜索 api—sklearn.model_selection.GridSearchCV

sklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None)

  1. estimator ----估计器对象
  2. param_grid=None----估计器参数
  3. 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
发布了39 篇原创文章 · 获赞 1 · 访问量 386

猜你喜欢

转载自blog.csdn.net/qq_39441111/article/details/104729780