文章目录
绪论
今年读研了,学校要求参加研究生数学建模大赛,9.26就要开始了,but今天已经是9.15了,算是从今天开始入门吧。
感觉从0开始看理论已经来不及了,从之前参加研究生数学建模大赛的同学那里取取经,他建议直接从代码出发进行学习,不会的问chatgpt,然后多总结,从应用向理论进军。
那我选择的就是bilibili里面数学建模老哥的视频,然后搞清楚每一行代码,因为毕竟是工科,单纯的理论无法支撑自己的代码实践。
注:我采用这种方法的原因是因为我自己还是有较好的python基础,之前也用python开发过不少东西,所以对于语法什么的还算比较熟练,相信同样适用于对于任意一门编程语言熟悉的相似的同学,如果对于编程一点基础没有的同学,可能我的学习方法比较吃力了
代码初入门
下面是第一部分的代码,对于自己还是比较难理解里面的很多代码的。
鸢尾花分类代码入门
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.datasets import load_iris
iris_dataset = load_iris()
# 分离数据集
X = iris_dataset.data # 特征数据
Y = iris_dataset.target # 目标数据
validation_size = 0.2 # 验证集比例
seed = 7 # 随机数种子
# 将数据集分为训练集和验证级
X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y, test_size=validation_size, random_state=seed)
# 算法
models = {
}
# 第一个模型 逻辑回归模型
models['LR'] = LogisticRegression()
# 第二个模型 聚类模型(K临近分类器)
models['KNN'] = KNeighborsClassifier()
# 第三个模型 线性判别分析模型
models['LDA'] = LinearDiscriminantAnalysis()
# 第四个模型 决策树模型
models['CART'] = DecisionTreeClassifier()
# 第五个模型 支持向量机模型
models['SVM'] = SVC()
# 第六个模型 高斯朴素贝叶斯模型
models['NB'] = GaussianNB()
results = []
# 使用交叉验证对每个模型进行评估
for key in models:
# 十折检验
kflod = KFold(n_splits=10, random_state=seed, shuffle=True)
cv_results = cross_val_score(models[key], X_train, Y_train, cv=kflod, scoring="accuracy") # 计算模型性能
results.append(cv_results)
print('%s: %f (%f)' % (key, cv_results.mean(), cv_results.std()))
# 结果报告
svm = SVC() # 创建一个支持向量机模型
svm.fit(X=X_train, y=Y_train) # 在训练集上训练模型
predictions = svm.predict(X_validation) # 在验证集上进行预测
print(accuracy_score(Y_validation, predictions)) # 打印准确度
print(confusion_matrix(Y_validation, predictions)) # 打印混淆矩阵
print(classification_report(Y_validation, predictions)) # 打印分类报告
这部分代码有几个概念我需要进行深度理解
1、随机数种子
chatgpt:
随机数种子(Random Seed)是在生成随机数时用来初始化伪随机数生成器的起始值。伪随机数生成器是计算机程序中用来生成看似随机的数字序列的算法,它们实际上是基于确定性的数学计算,因此被称为伪随机数生成器。
随机数种子的作用如下:
-
可重复性:在相同的随机数种子下,伪随机数生成器将生成相同的随机数序列。这对于调试和复现实验结果非常重要。如果你需要确保你的随机实验或模型可以复现,就应该使用相同的随机数种子。
-
控制随机性:通过设置不同的随机数种子,你可以控制伪随机数生成器生成的随机数序列。这对于进行实验时研究不同随机性对结果的影响很有用。如果你想比较不同的随机种子下的模型性能,可以多次运行实验并选择最好的结果。
-
消除偏差:在某些情况下,伪随机数生成器可能受到初始条件的影响,导致生成的随机数序列有一定的偏差。通过设置随机数种子,你可以在一定程度上消除这种偏差。
在编程中,通常通过设置随机数种子的方式来控制伪随机数生成器的行为。例如,在Python的random模块中,可以使用random.seed(seed)来设置随机数种子,其中seed是一个整数值。
总之,随机数种子是在伪随机数生成器中起到初始值的作用,用来确保随机性的可控性和可重复性,特别在科学研究、数据分析和机器学习中是非常有用的。
晦涩难懂?用代码简单说明一下吧
当你设置随机数种子时,你可以确保在相同的种子下生成的随机数是相同的。
import random
# 不设置随机数种子,生成两个随机数
random_number1 = random.random()
random_number2 = random.random()
print("随机数1(没有种子):", random_number1)
print("随机数2(没有种子):", random_number2)
# 设置随机数种子为1,生成两个随机数
random.seed(1)
random_number3 = random.random()
random_number4 = random.random()
print("随机数3(种子为1):", random_number3)
print("随机数4(种子为1):", random_number4)
# 再次设置随机数种子为1,生成两个随机数,结果会与上面的相同
random.seed(1)
random_number5 = random.random()
random_number6 = random.random()
print("随机数5(种子为1,再次生成):", random_number5)
print("随机数6(种子为1,再次生成):", random_number6)
这段代码首先使用random.random()
函数生成两个随机数,然后设置随机数种子为1,再次生成两个随机数。你会注意到,在设置了相同的种子后,生成的随机数是相同的。这就是随机数种子的作用,它确保了在相同种子下生成的随机数序列是可重复的。如果你更改种子,生成的随机数将不同。
总之,随机数种子允许你控制和复现伪随机数生成器的行为,这对于在机器学习、实验和模拟中需要可重复性的任务非常有用。
2、逻辑回归模型
逻辑回归模型:
逻辑回归是一种广泛用于分类问题的统计模型,它基于线性回归模型的概念,但经过了一些修改,以输出一个在0和1之间的概率值,用于描述样本属于某一类别的概率。
模型基本思想:
逻辑回归的基本思想是通过将线性函数的输出(称为“逻辑(logit)”)映射到0和1之间的概率来完成分类。这个映射通常是通过Sigmoid函数(也称为Logistic函数)来实现的。
σ ( z ) = 1 1 + ( e ) − z σ(z)=\frac{1}{1+(e )^{-z}} σ(z)=1+(e)−z1
逻辑回归模型的表达式如下:
P ( Y = 1 ∣ X ) = 1 1 + e − ( β 0 + β 1 X 1 + β 2 X 2 + ⋯ + β n X n ) P(Y=1∣X)= \frac{1}{1+e^{-(\beta_{0} + \beta_{1}X_{1} + \beta_{2}X_{2} + \cdots + \beta_{n}X_{n})}} P(Y=1∣X)=1+e−(β0+β1X1+β2X2+⋯+βnXn)1
其中, P ( Y = 1 ∣ X ) P(Y=1|X) P(Y=1∣X)表示给定输入特征 X X X条件下,样本属于类别1的概率; X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1,X2,…,Xn是输入特征; β 0 , β 1 , β 2 , … , β n \beta_0, \beta_1, \beta_2, \ldots, \beta_n β0,β1,β2,…,βn是模型参数,它们通过训练数据学习得到。
模型训练:
模型的训练过程通常使用最大似然估计(Maximum Likelihood Estimation,MLE)来估计模型参数。训练过程的目标是最大化观测数据的似然函数,从而找到最适合数据的模型参数。
预测:
一旦模型参数学习完成,就可以用于进行新样本的分类预测。通过计算 P ( Y = 1 ∣ X ) P(Y=1|X) P(Y=1∣