线性回归学习

1. 线性回归

定义与原理

: 线性回归是一种用来建立因变量与自变量之间线性关系的模型。

应用与解释: 线性回归广泛应用于预测和建模任务中。例如,在房价预测中,自变量可以是房屋的大小、地理位置等特征,因变量则是房价。通过最小化实际观测值与模型预测值之间的误差平方和(最小二乘法),可以得到最佳拟合的系数。

2. 线性判别分析 (LDA)

原理与特点: 线性判别分析是一种用于降维和分类的监督学习方法。其核心目标是通过找到一个投影方向,最大化不同类别之间的差异,同时最小化同一类别内部的差异。这使得它在数据集中不同类别之间有明显分离的情况下特别有效。

与PCA的比较: 与主成分分析(PCA)不同,LDA考虑类别信息,因此在分类任务中通常比PCA更有优势,尤其是在样本类别之间的差异较大时。

3. 多分类学习

方法和策略: 处理多分类问题时,常见的方法包括:

一对一 (One-vs-One): 每两个类别之间训练一个分类器,最后通过投票决定最终的类别。

一对其余 (One-vs-Rest): 每个类别与其余所有类别训练一个分类器,然后选取概率最高的类别作为预测结果。

多类别逻辑回归: 直接拟合多个类别的逻辑回归模型,输出每个类别的概率。

评估指标: 评估多分类任务的常用指标包括准确率、混淆矩阵、精确度、召回率、F1-score等。这些指标可以帮助评估模型在不同类别上的表现。

4. 类别不平衡问题

问题定义: 在某些数据集中,不同类别的样本数量可能差异很大,这就导致了类别不平衡问题。例如,在医学诊断中,罕见疾病的样本可能比普通疾病少得多。

解决方法: 针对类别不平衡问题,常见的解决方法包括:

过采样 (Oversampling): 过采样是通过增加少数类样本的数量来平衡不同类别的样本分布。这种方法可以帮助模型更好地学习少数类的特征,从而提高其在预测时的表现。一个常见的过采样算法是SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE算法: SMOTE算法通过在少数类样本之间插入新的合成样本来增加数据。它首先找到每个少数类样本的若干个最近邻,然后在这些最近邻中随机选择一个点,沿着这两个点的连线生成新的合成样本。这种方法能够有效地增加数据的多样性,防止过拟合。

欠采样 (Undersampling): 欠采样是通过减少多数类样本的数量来实现样本均衡。它可以简化模型的训练过程,减少计算复杂度,同时提高模型对少数类的敏感度。然而,欠采样可能会丢失一些重要的多数类信息,因此需要谨慎使用,以避免信息损失。

生成合成样本: 生成合成样本的方法利用生成模型,如生成对抗网络(GAN),来生成新的少数类样本。这些合成样本不是从已有的少数类样本中复制,而是通过模型学习数据分布后生成的。这种方法可以有效地增加数据集中少数类的数量,同时保持数据的多样性和真实性。

改变分类阈值: 在类别不平衡的情况下,模型可能会倾向于预测为多数类。通过调整分类阈值,可以平衡模型的精确度(Precision)和召回率(Recall)。通常情况下,降低分类阈值可以增加对少数类的识别,但也可能导致多数类的误判增加。因此,这种方法需要根据具体情况进行权衡。

使用不同的评估指标:在评估模型性能时,传统的准确率可能会误导,特别是在类别不平衡的情况下。ROC曲线下面积(AUC)是一种更适合评估不平衡数据集中分类器性能的指标。它考虑了所有可能的分类阈值,并综合考虑了模型的精确度和召回率,因此能够更全面地评估模型在不同类别上的表现。

在本次作业中,我便拟合了两种曲线来看种子费与化肥费之间的关系。

import pandas as pd
import numpy as np
import numpy
from scipy import stats
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt


# 设置文件路径
file_path = '棉花产量论文作业的数据.csv'
# 使用 pandas 的 read_csv 函数读取 CSV 文件,注意查看csv文件的编码,默认不填为utf-8编码
data = pd.read_csv(file_path,encoding='gbk')
# 显示数据的前几行来验证读取是否成功
print(data.head())
print(data.isnull().any())

# 检查是否存在缺失值
print("\n缺失值情况:")
print(data.isnull().sum())
# 填充或删除缺失值(这里我们选择填充为0,可以根据需要调整)
data.fillna(0, inplace=True)
# 确保每列的数据类型正确
df = data.convert_dtypes()
# 查看数据类型
print("\n数据类型:")
print(df.dtypes)

# X要素是种子费、化肥费、农药费、机械费、灌溉费
X = data.iloc[:, 2:]
# Y要素是单产
Y = data.iloc[:, 1]
Z = data.iloc[:,3]#huafei
M = data.iloc[:,2]#zhongzi
print(X)
print(Y)
print(Z)

# 将数据分为训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, Y_train)
# 预测测试集的结果
Y_pred = model.predict(X_test)
# 评估模型
mse = mean_squared_error(Y_test, Y_pred)
r2 = r2_score(Y_test, Y_pred)

print("Mean Squared Error:", mse)
print("R2 Score:", r2)

# 通过模型的系数和截距来查看每个X要素对Y的影响
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)


# 计算相关系数矩阵
correlation_matrix = X.corr()
print(correlation_matrix)
# 选择种子费作为要素
X_selected = data[['种子费']]

# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(X_selected['种子费'], Z, color='blue', label='种子费')
M = np.array(M).reshape(-1, 1) # 把M作为二维数组
lr = LinearRegression()
lr.fit(M, Z)
M_predict = lr.predict(M)
plt.scatter(M, Z )
plt.plot(M, M_predict)
plt.title('种子费化肥费之间的关系')
plt.xlabel('种子费')
plt.ylabel('化肥费')
plt.legend()
plt.grid(True)
plt.show()

x= data.iloc[:,2]
y= data.iloc[:,3]

mymodel = numpy.poly1d(numpy.polyfit(x, y, 4)) # 三阶

myline = numpy.linspace(0, 500, 200) #

plt.scatter(x, y) # 原始点
plt.plot(myline, mymodel(myline)) # 多项式回归
plt.show() #显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值