NLP学习开始01-线性回归

发布于:2025-07-28 ⋅ 阅读:(15) ⋅ 点赞:(0)


就搞最简单的线性回归(欢迎交流学习)
version:202507
环境配置请移步

什么线性回归

简单来讲就是构建一个方程,y=ax+b,a和b需要通过已经知道的y和x的关系取求得,最后呢,会得到一个能够根据输入的x得到的y值跟已知y值差距最小的一个方程,就比如下图就是一个回归,equation就是我们的模型。求得这个equation的过程就是我们的数据建模。
在这里插入图片描述
你看这不就已经学会了

线性回归和机器学习的关系

机器学习的历史
机器学习是一种人工智能领域中的方法,它让计算机通过数据和算法自主学习和改进,来获取新的知识和洞见。在机器学习的过程中,我们需要寻找最适合的算法来解决问题,线性回归就是其中之一。

线性回归的适用性

回归模型是一种重要的预测性建模技术,用于研究和揭示因变量(目标)与自变量(预测器)之间的关系,因变量和自变量都是连续的,回归线的性质也是线性的。线性回归的目标是在给定一个或多个自变量的情况下,找到一个最佳拟合线来描述因变量和自变量之间的关系;

线性回归的构建步骤

1.收集数据
2.数据EDA
3.特征工程
4.建立模型
5.训练模型
6.模型评估与优化

举个例子

喜闻乐见,房价预测,预测房价与什么有关系,这就是我们要解决的问题
1.获取数据

train = pd.read_csv("../data/train.csv") # 训练集 训练模型
testA = pd.read_csv("../data/test.csv") # 验证集 帮模型“调试优化”

2.数据EDA&特征工程(一边探查,一边处理)参考

# 二、数据EDA
#train.columns.tolist() # 查看数据列名
#pd.set_option('display.max_rows', None)
#print("train",train.shape) # 查看大小
#print(train.dtypes)
#train.describe()

# 绘制数值变量的关联关系
# 自动识别拆分数值型列和非数值型列
numeric_cols = train.select_dtypes(include=['number']).columns.tolist()
non_numeric_cols = train.select_dtypes(exclude=['number']).columns.tolist()
数值列的相关性
n_features = len(numeric_cols)
n_cols = 4
n_rows = (n_features + n_cols - 1) // n_cols
 
fig, axes = plt.subplots(
    nrows=n_rows,
    ncols=n_cols,
    figsize=(18, 5 * n_rows),  # 增大画布
    constrained_layout=True     # 启用自动布局
)
axes = axes.flatten()

for idx, feature in enumerate(numeric_cols):
    ax = axes[idx]  # 获取当前子图对象
    ax.scatter(train[feature], train['SalePrice'],s=10)
    ax.set_title(f"{feature}-price")
    ax.set_xlabel(feature)
    ax.set_ylabel("price")
plt.show()

在这里插入图片描述

# 从上面的图可以看出,那些列和房价具有一定的相关性
# LotFrontage 地块临街长度
# LotArea 土地面积 
# OverallQual 整体材料质量
# OverallCond	总体状况
# YearBuilt 建造年份
# YearRemodAdd 改造年份
# GarageYrBlt 车库建造年份 
#MasVnrArea 砖石饰面面积 
#BsmtFinSF1 地下室完成面积
#BsmtUnfSF 地下室未完成面积 
#TotalBsmtSF 地下室总面积 
#1stFlrSF 一层面积 
#2ndFlrSF 二层面积 
#TotRmsAbvGrd	地上总房间数
#GarageArea	车库面积
#GarageCars	车库容量
#WoodDeckSF	木甲板面积
#GrLivArea 地上居住面积
#OpenPorchSF 开放门廊面积
# 画热力图,查看相关性系数,进一步分析
corrmat = train.corr(numeric_only=True)
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True,cmap='coolwarm')

在这里插入图片描述

#进一步分析,选出10个相关性最强的变量
k = 10 #number ofvariables for heatmap 前十名
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index # 取相关性最强的前10名
cm = np.corrcoef(train[cols].values.T)  # 计算皮尔逊相关系数矩阵
sns.set(font_scale=1.25) # 全局设置seaborn的字体缩放比例
# 绘制热力图
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10},
yticklabels=cols.values, xticklabels=cols.values)
plt.show()

在这里插入图片描述

# 从上面的分析中,我们可以找出数值变量与价格相关性高的列
# FullBath、YearBuilt 并不是十分明显
# TotalBsmtSF、1stFlrSF 可以选这一个
# Garage系列可以选择一个
high_ofvariables = ['OverallQual','GrLivArea','GarageArea','TotalBsmtSF','TotRmsAbvGrd']
文本特征列相关性分析
# 对文本进行编码转换
from sklearn.preprocessing import LabelEncoder
for col in non_numeric_cols:
    le = LabelEncoder()
    train[col+'_encoded'] = le.fit_transform(train[col])
    testA[col+'_encoded'] = le.fit_transform(testA[col])
ANOVA方差分析
from sklearn.feature_selection import f_classif
label_columns = []
for col in non_numeric_cols:
    label_columns.append(col+'_encoded')


x=train[label_columns]   
y=train['SalePrice']
f_scores, p_values = f_classif(x, y)

feature_scores = pd.DataFrame({
    'Feature': x.columns,
    'F_Score': f_scores,
    'P_Value': p_values
}).sort_values('F_Score', ascending=False)

pd.set_option('display.float_format', lambda x: '%.10f' % x)

print("ANOVA分析结果:")
print(feature_scores)
#F_Score越高,特征与目标变量的相关性越强
#P_Value < 0.05 表示统计显著

在这里插入图片描述

# 通过ANOVA分析结果,我们可以考虑保留的特征列是
feature_data = feature_scores.query('F_Score>=1.5 and P_Value<0.05')
for i in feature_data['Feature']:
    high_ofvariables.append(i)

fianlly_train = train[high_ofvariables]
finall_test=test[high_ofvariables]
空值处理
# 空值处理 
# 查看空值
missing_report = pd.DataFrame({
    'Missing_Count': fianlly_train.isnull().sum(),
    'Missing_Ratio': (fianlly_train.isnull().sum() / len(fianlly_train)).round(4),
    'Valid_Count': fianlly_train.count(),
    'Valid_Ratio': (fianlly_train.count() / len(fianlly_train)).round(4)
})
#没有空值 不处理

missing_report2 = pd.DataFrame({
    'Missing_Count': finall_test.isnull().sum(),
    'Missing_Ratio': (finall_test.isnull().sum() / len(finall_test)).round(4),
    'Valid_Count': finall_test.count(),
    'Valid_Ratio': (finall_test.count() / len(finall_test)).round(4)
})
finall_test['GarageArea'] = finall_test['GarageArea'].fillna(finall_test['GarageArea'].mode()[0])
finall_test['TotalBsmtSF'] = finall_test['TotalBsmtSF'].fillna(finall_test['TotalBsmtSF'].mode()[0])

构建模型

# 训练模型
#导入线性回归模型
from sklearn.linear_model import LinearRegression #导入模型
#模型定义
model = LinearRegression()
#开始训练模型
# model1 = model.fit(X_scaled,y)
model1 = model.fit(fianlly_train,train['SalePrice'])

模型验证

predict = model1.predict(finall_test)
submission_df = pd.DataFrame(data={'Id': testA.index, 'SalePrice': predict})
submission_df.to_csv('output.csv', index=False)

网站公告

今日签到

点亮在社区的每一天
去签到