B. 正则化
C. 增加模型复杂性
D、以上所有
关于正则化,下列说法正确的是(A)
A. L1正则化得到的解更加稀疏
B.L2正则化技术也称为Lasso
C. L2正则化得到的解更加稀疏
D. L2正则化可以防止过拟合,提高模型的泛化能力,但L1正则化不能做到这一点。
关于特征选择,下列有关 Ridge 回归和 Lasso 回归的说法正确的是:(B)
A.岭回归适合特征选择
B.Lasso回归适合特征选择
C. 两者都适合特征选择
D.以上说法均不正确
在线性回归中,我们可以使用正规方程 ( ) 来求解系数。 下列关于正规方程的说法正确的是(多选):(ABC)
A. 无需选择学习率
B.当特征数量较多时,计算量会增加
C. 无需迭代训练
2 简答题 1. 简述常用的模型选择方法、特点及应用场景。
回答:
① 模型选择常用的方法有保持法、交叉验证法和引导法。
② Hold-out方法直接将数据集D分成两个互斥的集合,分别作为训练集和验证集; 交叉验证方法将数据集D划分为k个大小相似的互斥子集,每次选择其中一个或多个作为验证集,其余作为训练集; 方法每次从D中随机选择一个样本,将其副本放入训练集中,然后将样本放回到初始数据集D中,以便在下一次采样时仍然可以选择该样本。 重复m次这个采样过程得到的训练集然后交给模型进行训练,而没有采样到的样本可以作为测试集。
③留置法一般适用于数据量较大的场景。 简单省时,但会牺牲一小部分精度; 留一法是留一法的一种特殊情况。 当数据量特别小时,我们可以用它来分割数据集; 交叉验证方法也适用于数据量较小的场景,可以让我们充分利用唯一的数据来筛选出更可靠的模型。
2. 简要描述什么是线性回归以及我们可以用线性回归来解决什么样的问题。
回答:
①线性回归是利用数理统计中回归分析的一种统计分析方法,广泛用于确定两个或多个变量之间相互依赖的定量关系。
5、简述欠拟合和过拟合的原因及解决办法。
回答:
欠拟合的原因:
① 训练数据量太小;
②模型过于简单。
解决方案:
① 增加模型训练的数据量;
②增加模型的复杂度;
③ 添加多项式特征。
过度拟合的原因:
① 训练样本特征过多;
②模型过于复杂。
解决方案:
①加大对原始数据的数据清洗力度;
②增加训练样本数量,直到样本数量远大于特征数量;
③ 使用正则化;
④ 过滤特征,降低特征维度;
⑤ 采用集成学习方法构建模型。
6.简述实际开发中可以采用哪些方法来缓解代码层面的过拟合。
回答:
①使用Ridge Ridge回归,它使用带有L2正则化的线性回归模型,可以为模型产生平滑的权重系数,使某些特征的权重系数变小,减少某些特征对模型的影响。
②使用Lasso回归,它使用带有L1正则化的线性回归模型,可以为模型生成稀疏权重系数,使得某些特征的权重系数直接为零,消除某些特征对模型的影响,实现选择。
③使用弹性网络,它使用L1正则化和L2正则化的线性组合。 它继承了L1正则化和L2正则化的优点。 通过调整线性组合的系数,可以获得不同效果的模型。
④ 使用 Early 指定阈值。 如果模型训练过程中验证误差小于这个阈值,模型会及时停止,继续训练。
日常练习题 1.使用KNN算法预测打卡地点。
要求:
做好基础数据和数据处理; 选择适当的特征; 划分数据集,训练后查看模型的测试误差; 利用交叉验证和网格搜索完成模型筛选,并查看最优模型的参数。
代码示例:
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 获取数据集
data = pd.read_csv("./data/FBlocation/train.csv")
# 1、基本的数据处理
# 缩小数据范围(机器性能较好的同学可以忽略)
partial_data = data.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
# 处理时间特征
time = pd.to_datetime(partial_data["time"], unit="s")
time = pd.DatetimeIndex(time)
partial_data["hour"] = time.hour
partial_data["day"] = time.day
partial_data["weekday"] = time.weekday
# 去掉签到较少的地方
place_count = partial_data.groupby("place_id").count()
place_count = place_count[place_count["row_id"]>4]
partial_data = partial_data[partial_data["place_id"].isin(place_count.index)]
# 2、准备特征值数据和目标值数据
x = partial_data[["x", "y", "accuracy", "hour", "day", "weekday"]]
y = partial_data["place_id"]
# 分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=8, test_size=0.2)
# 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 模型训练
estimator = KNeighborsClassifier()
param_grid = {"n_neighbors": [1, 3, 5], "p": [1, 2]}
estimator = GridSearchCV(estimator=estimator, param_grid=param_grid, cv=5)
estimator.fit(x_train, y_train)
# 模型评估
print("模型在测试集上的准确率为:\n", estimator.score(x_test, y_test))
# 交叉验证中最好的模型及其参数
print("交叉验证中最好的模型是:\n", estimator.best_estimator_)
print("交叉验证中准确率最高是:\n", estimator.best_score_)
2.利用随机梯度下降优化方法的正规方程、线性回归模型和岭回归模型完成房价的预测。
要求:
使用内置房价数据集; 划分数据集,验证集比例可自定义,保证程序每次使用的数据集相同; 采用适当的特征预处理方法对原始数据进行处理; 使用模型与 选择岭回归模型; 评估每个训练好的模型,比较效果,思考和讨论。
代码示例:
# coding:utf-8
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, RidgeCV, Ridge
from sklearn.metrics import mean_squared_error
def linear_reg_model():
# 1.获取数据
boston = load_boston()
# 2.数据基本处理
# 2.1 分割数据
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.25, random_state=8)
# 3.特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 机器学习-线性回归-正规方程求解
estimator1 = LinearRegression()
estimator1.fit(x_train, y_train)
print("正规方程求解出的模型偏置是:\n", estimator1.intercept_)
print("正规方程求解出的模型系数是:\n", estimator1.coef_)
# 模型评估-正规方程求解
y_pre = estimator1.predict(x_test)
ret = mean_squared_error(y_test, y_pre)
print("正规方程求解最优解模型的均方误差为:\n", ret)
# 机器学习-线性回归-随机梯度下降求解
estimator2 = SGDRegressor(max_iter=1000)
estimator2.fit(x_train, y_train)
print("随机梯度下降求解出的模型偏置是:\n", estimator2.intercept_)
print("随机梯度下降求解出的模型系数是:\n", estimator2.coef_)
# 模型评估-随机梯度下降求解
y_pre = estimator2.predict(x_test)
ret = mean_squared_error(y_test, y_pre)
print("随机梯度下降求解出的模型的均方误差:\n", ret)
# 机器学习-线性回归-岭回归
# estimator = Ridge(alpha=1.0)
estimator3 = RidgeCV(alphas=(0.001, 0.01, 0.1, 1, 10, 100))
estimator3.fit(x_train, y_train)
print("带有交叉验证的岭回归模型的偏置是:\n", estimator3.intercept_)
print("带有交叉验证的岭回归模型的系数是:\n", estimator3.coef_)
# 模型评估-岭回归
y_pre = estimator3.predict(x_test)
ret = mean_squared_error(y_test, y_pre)
print("带有交叉验证的岭回归模型的均方误差:\n", ret)
print("交叉验证中表现最好的模型的参数alpha为:\n", estimator3.alpha_)
if __name__ == '__main__':
linear_reg_model()
3.延伸阅读企业面试题线性回归的基本假设不包括以下哪一项:(C)
A.随机误差项是期望值为0的随机变量
B.随机误差项对于解释变量的所有目标值具有相同的方差
C. 随机误差彼此相关
D.解释变量是确定性变量,而不是随机变量,并且与随机误差项无关。
E.随机误差项服从正态分布
答案分析:线性回归的基本假设是: 1、随机误差项的期望值或平均值为0; 2、随机误差项服从正态分布; 3、随机误差项彼此不相关; 4.对于解释变量的所有观测值,随机误差项具有相同的方差; 5、解释变量是确定性变量,不是随机变量,且与随机误差项无关; 6、解释变量之间不存在精确(完全)线性关系,即解释变量的样本观测矩阵是满秩矩阵。
假设有N个样本,其中一半用于训练,一半用于测试。 如果增加N的值,训练误差和测试误差之间的差距会如何变化? (二)
A、增加
B、减少
答案分析:如果添加更多的数据,可以有效缓解过拟合,缩小训练样本误差与测试样本误差的差距。
3.请解释并证明:使用方法对包含n个样本的数据集进行采样,n次采样完成后数据集中剩余的未采样样本的比例。
答:一次抽样中某个样本未被抽中的概率为: