前言
以下问题以Q&A形式记录,基本上都是笔者在初学一轮后,掌握不牢或者频繁忘记的点
Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系,也适合做查漏补缺和复盘。
本文可以让读者用作自查,答案在后面,需要时自行对照。
问题集
Q1:奥卡姆剃刀原理?
Q2:KNN的思想?欠拟合和过拟合在KNN中的体现?
Q3:这里尝试把for输出的数经过distance计算,存储到一个数组里面去
distance = np.sqrt( (i-data_new)[0] ** 2 + (i-data_new)[1] ** 2 ) for i in data_X ,哪里有错误?
Q3.1:我通过sklearn中的什么函数可以生成自定义的这种数据集?(答案中有代码,生成数据集的常用方式)
Q4:利用sklearn的库进行KNN分类,其X_train,y_train 和 data_new 的数据类型分别是什么?
Q5:这两个方法分别是干什么用的?哪些数据会使用到这类函数?
Q6:数据集切分的用法?
Q7:有一段KNN算法代码:
from sklearn.neighbors import KNeighborsClassifier
knn_classifier = KNeighborsClassifier(n_neighbors=3,weights='distance',p=2
)
这段代码中的 weights='distance', p=2 分别代表什么意思?
Q8:什么是网格搜索?
Q9:通过sklearn划分数据集?其中最主要的函数是哪个?
Q10:模型评估的以下几个函数中 .fit 方法应该在哪个位置?简单得到score的方法?模型评估的底层实现?
from sklearn import datasets
from sklearn.model_selegtenimport train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
Q11:如何使用sklearn的库进行超参数搜索?(一句话,用什么接口进行网格搜索?)
Q12:归一化有关问题:StandardScaler
1)最大最小值归一化;零均值归一化?
2)StandardScaler 工具的使用?
3)陷阱:测试集如何进行归一化
Q13:knn中分类问题转化为回归问题,决策规则由分类表决变成了均值法,why?
Q14:knn的印象?优缺点?
线性算法(线性模型):
Q15:其中三者分别属于分类任务还是狭义的回归任务?这两类任务有何不同?
Q16:data = datasets.load_iris() 如何取data的前20个数据样本?是不是 data[:20] ?
Q17:最小二乘法是不是一种投票表决?
Q18:最小二乘法的核心代码?(有足够印象即可)
Q19:.reshape(-1,1) 的核心含义是什么?为什么这里写一个 -1 ?
Q20:MSE和RMSE?这俩一般用模型评估吗?
Q21:R2 具体的好处?
Q22:多项式回归的本质?
Q23:如果在 plt.plot(x,y) 中,x是乱序的,怎么办?(假设之前有 y=x**2+3 已经一一对应上)
Q24:model.coef_ , model.intercept_ 分别是什么意思
Q25:对于model = LinearRegression() 多项式回归,可以多用一下 model.predict(X_new) 方法
注意 X_new 应是一个列向量
Q26:sklearn中,多项式回归的API? 其中的一个参数是degree,代表什么?
Q27:逻辑回归
Q28:逻辑回归中的 “正则化” 是什么意思?(regularization)
Q29:多分类问题:OvO和OvR,大致思想是什么
参考解答
Q1:奥卡姆剃刀原理?
A1:简单的东西才是最好的;
Q2:KNN的思想?欠拟合和过拟合在KNN中的体现?
A2:
Q3:这里尝试把for输出的数经过distance计算,存储到一个数组里面去
distance = np.sqrt( (i-data_new)[0] ** 2 + (i-data_new)[1] ** 2 ) for i in data_X ,哪里有错误?
A3:这里需要将中括号括起来,否则 distance 不是一个数组
distance = [ np.sqrt( (i-data_new)[0] ** 2 + (i-data_new)[1] ** 2 ) for i in data_X ]
ps,这个语法和基本的创建数组是一样的: a = [ x for x in range(0,3) ]
Q3.1:我通过sklearn中的什么函数可以生成自定义的这种数据集?(答案中有代码,生成数据集的常用方式)
A3.1:生成几个blob数据聚集,并用散点图表示(using sklearn.datasets.make_blobs() )
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 设置随机种子以获得可重复的结果
random_state = 42# 生成三个blob数据
# centers: 每个blob的中心点
# cluster_std: 每个blob的标准差,控制blob的扩散程度
centers = [[-5, 5], [0, 0], [5, -5]]
cluster_std = [1.5, 0.5, 1.0]# 生成数据
X, y = make_blobs(n_samples=300, centers=centers, cluster_std=cluster_std, random_state=random_state)# 可视化生成的数据
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='viridis')
plt.title('Generated Blobs')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
Q4:利用sklearn的库进行KNN分类,其X_train,y_train 和 data_new 的数据类型分别是什么?
A4:X_train,y_train 特别的用大小写做了区分,一般X_train是切分后的训练集的数据,y_train是训练集的tag
而 data_new 是一个 ndarry 形式,或者是 ndarry 数组形式的,准备对齐进行分类的数据
Q5:这两个方法分别是干什么用的?哪些数据会使用到这类函数?
A5:打乱数据。需要注意的是,一般我们不会去破坏X和y,打乱的时候我们主要还是尝试去打乱
Q6:数据集切分的用法?
A6:
Q7:有一段KNN算法代码:
A7:
对于参数weight
'uniform':所有邻居的权重相同,不考虑它们与查询点的距离。
'distance':权重与距离成反比,即距离查询点越近的邻居对最终决策的影响越大。
对于参数 p(明氏距离):
当p = 1时,使用的是曼哈顿距离(Manhattan distance),也称为城市街区距离,适用于各个维度的数值差异。(二维就是x+y,走直线)
当p = 2时,使用的是欧几里得距离(Euclidean distance),这是最常见的距离度量方式,适用于连续数据。
当p值更大时,更注重远距离的影响,即距离查询点较远的邻居对决策的影响更大。p→∞时叫切比雪夫距离。
Q8:什么是网格搜索?
A8:
Q9:通过sklearn划分数据集?其中最主要的函数是哪个?
A9:train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
testsize:训练集的占比,这个也同样可以用 train_size 进行代替
X 是特征数据集。
y 是目标变量,即标签数据。
random_state 代表随机数 seed
Q10:模型评估的以下几个函数中 .fit 方法应该在哪个位置?简单得到score的方法?模型评估的底层实现?
A10:knn分类中如果要做预测,直接在实例化分类器之后 fit 即可
简单方法:可以直接对 classifier.score 进行查询。模型评估的本质就是 check 验证集的predict结果和real结果的相同比例
Q11:如何使用sklearn的库进行超参数搜索?(一句话,用什么接口进行网格搜索?)
A11:在scikit-learn(简称sklearn)中,进行超参数搜索时,通常不会直接使用测试集数据
超参数搜索中,GridSearchCV即网格搜索,其实就是遍历所有的params_grid组合(内部嵌套几个for循环实现)
可以注意到,params_grid要求以字典形式定义,其中的诸多变量应该以“可迭代”的变量类型出现,以便可枚举。
在 sklearn中,可以使用 GridSearchCV 或 RandomizedSearchCV 等工具来进行超参数搜索,它们都内置了交叉验证机制,可以在不使用测试集的情况下帮助找到最佳的超参数组合。一旦确定了最佳超参数,就可以使用整个训练集(包括之前用作验证集的部分)来训练最终模型,然后使用测试集来评估其性能。
Q12:归一化有关问题:StandardScaler
A12:在进行训练集
1)X-min / max-min; X-μ / σ; 这里的 μ 可以通过 np.mean 求得,σ可以通过 np.std 获得
2)关键编码:
from sklearn.preprocessing import StandardScaler
standard_scaler = StandardScaler() # 实例化
standard scaler.fit(X)
x_train=standardScaler.transform(x_train)# 归一化
3)陷阱问题:
Q13:knn中分类问题转化为回归问题,决策规则由分类表决变成了均值法,why?
K-近邻(K-Nearest Neighbors, KNN)算法是一种基于实例的学习算法,它通过测量不同特征值之间的距离来进行分类或回归。在KNN中,分类问题和回归问题的处理方式略有不同,但基本原理相似。
1. KNN分类问题
在KNN分类问题中,决策规则通常是“多数投票”(majority voting)。这意味着算法会找出测试样本的K个最近邻居,然后根据这些邻居的类别来进行投票,选择出现次数最多的类别作为测试样本的预测结果。
2. KNN回归问题
在KNN回归问题中,决策规则变为计算这些K个最近邻居的输出值的均值。这是因为在回归问题中,我们的目标是预测一个连续值,而不是分类问题中的离散标签。均值法可以提供一个平滑的预测值,它考虑了所有邻居的影响,而不是简单地选择一个类别。
Q14:knn的印象?优缺点?
A14:knn是奥卡姆剃刀原理的一个典例,简单粗暴;
问题是k难以确定,其计算量和存储要求都比较大,对于新数据到每个样本的d都必须求
Q15:线性算法中,三者分别属于分类任务还是狭义的回归任务?这两类任务有何不同?
A15:其中线性回归、多项式回归属于狭义的回归任务(找线),逻辑回归属于分类任务
Q16:data = datasets.load_iris() 如何取data的前20个数据样本?是不是 data[:20] ?
A16:# data.data 是一个二维数组,其中每一行代表一个样本的所有特征
data_samples = data.data[:20]
Q17:最小二乘法是不是一种投票表决?
A17:最小二乘法并不是一种投票表决机制,而是一种数学优化技术。它主要用于统计学和数据分析中,用于拟合数据到一个数学模型。
Q18:最小二乘法的核心代码?
A18:
首先 x,y 经过预处理:
(array([5.1, 4.9, 4.7, 4.6, 5. , 5.4, 4.6, 5. , 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1]), array([1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5]))
之后编码:
x_mean = np.mean(x)
y_mean = np.mean(y)# 计算a的分子和分母
a_top = sum((xi - x_mean) * (yi - y_mean) for xi, yi in zip(x, y))
a_bottle = sum((xi - x_mean) ** 2 for xi in x)# 计算斜率a和截距b
a = a_top / a_bottle
b = y_mean - a * x_mean
Q19:.reshape(-1,1) 的核心含义是什么?为什么这里写一个 -1 ?
A19:
Q20:MSE和RMSE?这俩一般用模型评估吗?
A20:MSE(均方误差,Mean Squared Error)和RMSE(均方根误差,Root Mean Squared Error)都是衡量一个模型预测值与实际观测值之间差异的统计量,常用于评估回归分析中的模型性能。不过更重要的,MSE/RMSE和MAE一起更容易被当做loss函数使用
Q21:R2 具体的好处?
A21:R^2也是模型评估方法,消除了量纲上的影响,不与本身取值大小相关,实现了归一化;
并且正相关,可以判定有多么拟合。R2结果越大越好
甚至于,说sklearn线性回归模型,自带的模型评价方法就是r方。
Q22:多项式回归的本质?
A22:转换成了有两个特征的线性回归的式子,多项式回归的本质就是为样本多添加一些特征进行升维
具体思路就是将式子中的x平方看成是一个特征x1,将x看成是另一个特征x2...
之后就用线性回归的思路
Q23:如果在 plt.plot(x,y) 中,x是乱序的,怎么办?(假设之前有 y=x**2+3 已经一一对应上)
A23: plt.plot(np.sort(x), y[ np.argsort(x) ])
Q24:model.coef_ , model.intercept_ 分别是什么意思
A24:回归代码。
model.coef_:
这是模型的系数(coefficients)向量k,它包含了线性模型中每个特征的权重。
model.intercept_:
这是模型的截距项(intercept)b,它代表了当所有特征都为零时,模型预测的目标值。
Q25:对于model = LinearRegression() 多项式回归,可以多用一下 model.predict(X_new) 方法
注意 X_new 应是一个列向量
A25:
对于多项式回归,可以多用一下.predict方法
Q26:sklearn中,多项式回归的API? 其中的一个参数是degree,代表什么?
A26:PolynomialFeatures(degree=N) 表示的是我们要为原来的这个数据样本添加最多几次幂相应的特征
Q27:逻辑回归
A27;逻辑回归方法对于二分类就是一个固定损失函数公式的方法,如下图。多分类时考虑OvO或者OvR
逻辑回归最主要是一个带特征权重的回归方法,在机器学习和深度学习的背景下,都非常常用!
逻辑回归本身是个线性分类器,特长是二分类。对每个样本,分类1和2各自的概率 p1 p2 会通过式子求出
Q28:逻辑回归中的 “正则化” 是什么意思?(regularization)
A28:在原有的损失函数上加点东西不就行了吗,就是这么朴素的思想。起了个名字 regularization,
会让模型变得更加的稳定从而有效的避免过拟合现象,过滤掉不靠谱的特征。正则化的模型称之为范式,有L1正则化和L2正则化,其中L2-ridge回归更加平滑
Q29:多分类问题:OvO和OvR
A29