基于周志华老师的《机器学习》、上一篇学习笔记以及网络的其他资料,对线性模型的这一部分内容进行一个总结。
学习时间:2022.04.17~2022.04.18
文章目录
0. 数据预处理
尝试构建了一个可以通用处理的数据预处理函数(不能处理文本和时间数据,因为要具体情况具体分析)。
column_lists = list(df) # 获取所有的列名
bool_cos = [] # 获取所有的布尔类型列
classify_cos = [] # 获取所有的分类数据列
number_cos = [] # 获取所有的数据类型列
date_cos = [] # 获取所有的时间类型列
for i in column_lists:
if df[i].dtypes == 'bool':
bool_cos.append(i)
elif df[i].dtypes == 'object':
classify_cos.append(i)
elif str(df[i].dtypes) == 'datetime':
date_cos.append(i)
else:
number_cos.append(i)
# 缺失值添加是否缺失的特征列
for i in column_lists:
if df[i].isnull().any(): # 判断是否有缺失值
# 或者用if np.any(df[i].isnull()):
new_column = str(i + '_ifNaN') # 设置新列名
df[new_column] = df.apply(lambda df: 1 if df[i] == np.NaN else 0, axis=1)
# 对于分类型数据,使用众数填充
for i in classify_cos:
df[i] = df[i].fillna(df[i].mode()[0])
# 对于数值型数据,使用均值填充,并进行标准化(归一化的应用场景有限,可能会将数据的间距缩小)
for i in number_cos:
df[i].fillna(df[i].mean(), inplace=True)
def stand_sca(data):
data_standard = (data-data.mean())/data.std()
return data_standard
df[i] = stand_sca(df[i])
# 对于bool类型数据,使用众数填充,并转换成0和1
for i in bool_cos:
df[i].fillna(df[i].mode(), inplace=True)
df[i] = df[i].astype('int')
df = pd.get_dummies(df)
1. 用SK-Learn做线性回归模型
1.1 线性回归
sklearn.linear_model
.LinearRegression
1.2 随机梯度下降执行线性回归
sklearn.linear_model
.SGDRegressor
可能需要调整的参数:
-
loss
损失函数:要使用的损失函数。loss=“squared_error”
:平方误差损失函数,普通最小二乘;“loss=huber”
:增强平方误差损失函数对离群点的鲁棒性;“loss=epsilon_insensitive”
:标准SVR的损失函数,是L1损耗;“loss=squared_epsilon_insensit