03_机器学习面试题

在这里插入图片描述

博文配套视频课程:Python面试题与面试技巧


One-Hot编码与预处理

在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化,One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效

from sklearn.preprocessing import OneHotEncoder

enc = OneHotEncoder()
#  说所有的样本加起来必须保证所有列的特征值都要遍历到
result = enc.fit_transform([['男', '中国', '足球'],
                            ['女', '美国', '篮球'],
                            ['男', '日本', '羽毛球'],
                            ['女', '中国', '乒乓球']])
print(result)
print(enc.get_feature_names())
print(result.toarray())
print(enc.inverse_transform(result))
# 这里使用一个新的数据来测试
array = enc.transform([['男', '美国', '乒乓球']]).toarray()
print(array)

train_test_split各参数解释

import numpy as np
from sklearn.model_selection import train_test_split

# X: 所要划分的样本特征集
# y: 所要划分的样本结果
# test_size: 样本占比,如果是整数的话就是样本的数量
# random_state: 是随机数的种子,在需要重复试验的时候,保证得到一组一样的随机数,不填每次都不一样

X = np.arange(20)  # y = 12 : 8
y = ['A', 'B', 'A', 'A', 'A', 'B', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A', 'A', 'B', 'A', 'B', 'A', 'A']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)
print(X_test, y_test)

# stratify: 可以为类似数组或None
    # 1: 若为None时,划分出来的测试集或训练集中,其类标签的比例也是随机的
    # 2: 划分出来的测试集或训练集中,其类标签的比例同输入的数组中类标签的比例相同
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1,stratify=y)
print(X_test, y_test)

MAE、MSE、RMSE的区别和实现原理

在这里插入图片描述

y_predict = np.array([1,2,3,4])
# 均方误差时测试 1,2,3,12
y_true = np.array([3,4,5,6])
mae = np.average(np.abs(y_predict-y_true))
print('绝对值误差',mae)
mae = np.sum(np.abs(y_predict-y_true))/len(y_predict)
print('绝对值误差',mae)
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_true,y_predict)
# print('绝对值误差',mae)
# 均方误差, 测试会发现,如果误差值均衡,绝对值误差与均方误差几乎是相等的
mse = np.average((y_predict-y_true)**2)
print('均方根误差RMSE',np.sqrt(mse))
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_predict,y_true)
print('均方根误差',np.sqrt(mse))

上面三个模型解决了样本数量 m 和 量纲的影响。但是它们都存在一个相同的问题:当量纲不同时,难以衡量模型效果好坏。举个例子,模型在一份房价数据集上预测得到的误差 RMSE 是 5 万元, 在另一份学生成绩数据集上得到误差是 10 分。凭这两个值,很难知道模型到底在哪个数据集上效果好。


R2 公式推导

在这里插入图片描述

from sklearn.metrics import r2_score

y_true = np.array([3,5,7,9])
y_predict = np.array([4,5,9,11])
# lr.socre() 函数调用了 r2_score
print(r2_score(y_true, y_predict))
print(1 - np.sum((y_predict - y_true)**2) / np.sum((y_true.mean() - y_true)**2))
  1. 由于右边的分数的分子与分母都是平方,因此R2 <=1
  2. 当我们不犯任何错误时,分子为0,R2得到的最大值为1
  3. 当我们的模型等于基准模型时,整个分数为1,这时R2为0
  4. 如果R2<0,说明我们学习到的模型还不如基准模型,此时,很有可能我们的数据不存在任何线性关系

准确率,精确率,召回率

医院有1000的检测样本,其中里面有10个人得了癌症,医院想通过模型把患有癌症的10个筛查出来。如果仅仅用正确率来评价的话,医院不用做任何操作,直接判定所有的样本都未患病,那么正确率可以达到99%,但是这种正确率其实没有意义的。

# 所有分类模型,都是调用 accuracy_score
from sklearn.metrics import accuracy_score
print(accuracy_score([1,1,1],[1,1,0]))

精确率与召回率

T 代表预测正确, F代表预测错误, Postive 正类, Negative 负类

  1. TP: 预测正确, 且被预测成正类,那么说明真实值是正类 (True Postive TP)
  2. TN:预测正确,且被预测成负类,那么真实值是负类 (True Negative TN)
  3. FP:预测错误,且被预测成了正类,那么真实值是负类 (False Postive FP)
  4. FN:预测错误, 且被预测成了负类,那么真实值是正类 (False Negative FN)

精确率和召回率公式

精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),也就是

精确率 = 将正类预测为正类 / 所有预测为正类 ==> TP /(TP + FP)

而召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。

召回率 = 将正类预测为正类 / 所有真正的正类 ==> TP / (TP + FN)

其实就是分母不同,一个分母是预测为正的样本数,另一个是原来样本中所有的正样本数。

举个栗子

假设我们手上有10个样本标准答案为:6个正样本,4个负样本,我们要找出所有的正样本,系统预测出5个正样本,其中只有4个真正的正样本,计算上述信息求出:TP、TN、FP、FN

根据信息,系统预测为5正5负, 5个正样本中有4个是真正真样本,有一个负样本预测成了正样本。那可以推断出负样本中有3个是真正负样本,而剩余2个是正样本预测成了负样本

TP:将正类预测为正类数4 (5个里面其中有4个是真正的正样本)
TN:将负类预测为负类数3 (原本6个正样本,但是只预测中了4个,剩下的2个就在预测的5个负样本数中,因此负类预测为负类数则为3)
FP:将负类预测为正类数1 (5个里面其中有4个是真正的正样本,因此得出1个本身是负类,预测成了正类)
FN:将正类预测为负类数2 (原本6个正样本,但是只预测中了4个,那么有2正样本预测为了负样本)

# 10个样本6个正样本,4个负样本
y_true = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
# 系统预测出来5个正样本与5个负样本,其中只有4个真正的正样本
y_predict = [1, 1, 1, 1, 0, 0, 0, 0, 0, 1]
# 1. 准确率 = 所有预测正确的样本 / 总的样本
from sklearn.metrics import accuracy_score
print(accuracy_score(y_true,y_predict)) # 看源码有案例
# TP:将正类预测为正类数4
# FN:将正类预测为负类数2
# FP:将负类预测为正类数1
# TN:将负类预测为负类数3
# 2. 精确率 = 将正类预测为正类 / 所有预测为正类 ==> TP /(TP + FP)
print('精确率:',4 / (4 + 1))
# 3. 召回率 = 将正类预测为正类 / 所有真正的正类 ==> TP / (TP + FN)
print('召回率:',4 / (4 + 2))

如何取舍

precision高好还是recall高好,要看你的检测系统的具体目标

垃圾邮件检测

我们希望做出的检测都是足够精确的,尽可能的检出的垃圾邮件都是真的垃圾邮件,不要把有用的邮件检测为垃圾邮件!,比如一封十分重要的工作邮件被检测成了垃圾邮件,这是不能容忍的. 而一个真正的垃圾邮件,我们没有检测出来,没有关系,我手动删掉就好了. 这种情况下,precision就要尽可能高.

癌症检测

我们希望真正的癌症病人要尽可能第被检测到,比如,一个人患了癌症,但是我们没检测到,耽误了治疗的最佳时机,这是不能容忍的. 而一个良性的病人被误检测为癌症,没有关系,我们后续还有更多的医疗手段确定这个人是不是真的癌症. 这种情况下,recall就要尽可能的高.

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值