[KI-zugrundeliegende Logik] - Lineare Regression „Mathematischer Walzer“ (Codetest)

Inhaltsverzeichnis

1. Tatsächliche Messung des linearen Regressionscodes mit einer Variablen

2. Statistische Analyse

1. Statistikmodellbibliothek

2. Berechnen Sie verschiedene Statistiken

3. F-Test, t-Test

4. Konfidenzintervall, Vorhersageintervall

5. Restnormalitätstest

6. Autokorrelationserkennung


1. Tatsächliche Messung des linearen Regressionscodes mit einer Variablen

①Importieren Sie verwandte Module

Importieren Sie zunächst die erforderlichen Module. Hier verwenden wir hauptsächlich die umfangreichen Algorithmusmodule, die in der Sklearn-Bibliothek von Python enthalten sind ! Sie können die spezifischen Funktionen jeder Bibliothek selbst überprüfen. Hier erkläre ich nur die Ideen.

import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
import sklearn
import matplotlib.pyplot as plt
import seaborn
from pylab import rcParams
rcParams['figure.figsize'] = 10,8
from sklearn import datasets,linear_model
from sklearn.linear_model import LinearRegression,Ridge,Lasso  #后面两个是套索回归和岭回归,暂时用不到
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression,Lasso,Ridge  
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error
from sklearn.model_selection import KFold  #老函数cross_validation改名为model_selection
from sklearn.datasets import load_boston
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from scipy.interpolate import make_interp_spline   #老函数spline改名为make_interp_spline
from sklearn.neighbors import KNeighborsRegressor
from sklearn.kernel_ridge import KernelRidge

②Daten importieren und anzeigen

#读取数据
regression_data = pd.read_csv('simple_regression_data.csv')    #加载数据集csv文件:1000x2(1列名Volume,1列名Price)
#绘制数据散点图,观察数据分布
plt.scatter(regression_data['Volume'],regression_data['Price'])
plt.xlabel('Volume')
plt.ylabel('Price')
plt.title('Price-Volume Data')
plt.show()

③Unterteilen Sie den Trainingssatz und den Testsatz

#数据分割为训练集80%和测试集20%,每次运行划分都是随机的(设置random_state参数为一个任意整数即可解除这种随机)
X_train, X_test, Y_train, Y_test = 
            train_test_split(regression_data['Volume'],regression_data['Price'],test_size=0.20)

④Algorithmusobjekte erstellen und trainieren (Anpassung)

#创建线性回归对象
simple_linear_regression = LinearRegression()
#利用训练集训练数据
X_train = X_train.values
Y_train = Y_train.values
X_test = X_test.values
simple_linear_regression.fit(pd.DataFrame(X_train),pd.DataFrame(Y_train))  #fit方法训练模型找规律

⑤Verwenden Sie den Testsatz zur Vorhersage und Ausgabe

#使用测试集进行预测
Y_predict = simple_linear_regression.predict(pd.DataFrame(X_test))         #predict方法预测测试数据
#输出拟合后的图像
plt.scatter(X_test,Y_test,color='blue')             #测试集散点图
plt.plot(X_test,Y_predict,color='red',linewidth=2)  #测试集部分折线图(直线)
plt.show()

2. Statistische Analyse

1. statsmodelsBibliothek

statsmodelsLineare Regression, die Bibliothek mit Bibliothek vergleichtscikit-learn

Der obige Code verwendet LinearRegression() in der scikit-learn-Bibliothek, um eine lineare Regression zu implementieren. Als nächstes verwenden wir die Methode sm.OLS der gewöhnlichen kleinsten Quadrate (OLS) der Statsmodels-Bibliothek für die lineare Regressionsmodellierung. Im Vergleich besteht der Hauptunterschied darin, dass die beiden unterschiedliche Funktionen und Ausgänge bieten :

(1) Funktion:
   LinearRegression() ist eine lineare Regression von Scikit-Learn. Ihr Hauptzweck besteht darin, maschinelle Lernaufgaben wie Vorhersagen oder Klassifizierungen auszuführen. Das Modelldesign von scikit-learn ist einfacher und für eine Vielzahl maschineller Lernaufgaben geeignet.
   Das OLS-Modell von statsmodels konzentriert sich mehr auf die statistische Analyse und liefert detailliertere Informationen über die statistischen Eigenschaften des Modells, wie z. B. p-Werte, Konfidenzintervalle usw. Es wird häufig für Regressionsanalysen und statistische Schlussfolgerungen verwendet und eignet sich besser für Datenanalysen, die detaillierte statistische Informationen erfordern .

(2) Ausgabe:
   LinearRegression()- Objekte liefern normalerweise keine direkten statistischen Informationen, sondern die Koeffizienten, Achsenabschnitte usw. des Modells. Für Statistiken müssen Sie andere Methoden oder Bibliotheken zur Analyse verwenden .
   Das OLS-Modell von statsmodels bietet über model.summary() eine sehr detaillierte Zusammenfassung der Modellstatistiken , einschließlich ANOVA-Tabellen, Koeffizienten, Standardfehler, t-Statistiken, p-Werte usw.

Allgemein:

Wenn Ihr Hauptaugenmerk auf Vorhersagen und maschinellen Lernaufgaben liegt , ist LinearRegression() möglicherweise praktischer. Wenn Sie an Statistiken und detaillierten Eigenschaften des Modells interessiert sind oder eine Regressionsanalyse durchführen möchten, ist das OLS-Modell von statsmodels besser geeignet. In einigen Fällen können beide gleichzeitig in der Analyse verwendet werden, wobei je nach Bedarf das geeignete Werkzeug ausgewählt wird.

Die oben genannten Codes ①-③ bleiben unverändert, einige Module in ① werden jedoch nicht mehr verwendet.

④Verwenden Sie die Methode der gewöhnlichen kleinsten Quadrate sm.OLS der Statsmodels-Bibliothek für die lineare Regressionsanpassung.

import statsmodels.api as sm
# 添加截距项
X_train_sm = sm.add_constant(X_train)  #将数据转换为 statsmodels 支持的格式
X_test_sm = sm.add_constant(X_test)

# 创建OLS模型(普通最小二乘法)
model = sm.OLS(Y_train, X_train_sm).fit()

Sehen Sie sich die Modellzusammenfassung an, die bereits einige Statistiken enthält. Sie können auch die Funktion anova_table =sm.stats.anova_lm(model) aufrufen, um die Varianzanalysetabelle zu berechnen, aber während des Experiments tritt ein Fehler auf. AttributeError: Das Objekt „PandasData“ hat keine Attribut' design_info' Ich weiß nicht warum. ? ? Wenn jemand es weiß, kommentieren Sie es bitte im Kommentarbereich.

# 模型摘要
summary = model.summary()
print("最小二乘(OLS)回归结果:")
print(summary)

2. Berechnen Sie verschiedene Statistiken

Sie können auch die Funktion anova_table = sm.stats.anova_lm(model) aufrufen, um die Varianzanalysetabelle zu berechnen, aber während des Experiments tritt ein Fehler auf. AttributeError: Das Objekt „PandasData“ hat kein Attribut „design_info“. Ich weiß nicht warum ? ? Wenn jemand es weiß, kommentieren Sie es bitte im Kommentarbereich.

# 计算各种统计量
y_pred = model.predict(X_test_sm)
residuals = Y_test - y_pred #计算残差
print("残差:" )
print(residuals)

# 数据总离差平方和 SST
total_sum_of_squares = np.sum((Y_test - np.mean(Y_test))**2)
print("总离平方和(SST):%f" % total_sum_of_squares)

# 回归平方和  SSR
regression_sum_of_squares = np.sum((y_pred - np.mean(Y_test))**2)
print("回归平方和(SSR):%f" % regression_sum_of_squares)

# 残差平方和  SSE
residual_sum_of_squares = np.sum(residuals**2)
print("残差平方和(SSE):%f" % residual_sum_of_squares)

# 总离差自由度 DFT
dft = len(Y_test) - 1 #非NaN样本数量-1
print("总离差自由度(DFT):%d" % dft)

# 回归自由度 DFR
dfr = 2-1  # 回归模型参数数量-1
print("回归自由度(DFR):%d" % dfr)

# 残差自由度 DFE
dfe = dft - dfr #非NaN样本数量-回归模型参数数量
print("残差自由度(DFE):%d" % dfe)


# 平均总离差 MST
mean_total_sum_of_squares = total_sum_of_squares / dft
print("平均总离差(MST):%f" % mean_total_sum_of_squares)

# 平均回归平方  MSR
mean_regression_sum_of_squares = regression_sum_of_squares / dfr
print("平均回归平方(MSR):%f" % mean_regression_sum_of_squares)

# 残差平均值  MSE
mean_residual_sum_of_squares = residual_sum_of_squares / dfe
print("残差平均值(MSE):%f" % mean_residual_sum_of_squares)

# 均方根残差  RMSE
root_mean_square_residual = np.sqrt(mean_residual_sum_of_squares)
print("均方根残差(RMSE):%f" % root_mean_square_residual)

#拟合优度决定系数R^2系数(这里一元线性回归,不用修正决定系数)
R2 = regression_sum_of_squares / total_sum_of_squares #SSR/SST或1-SSE/SST
print("R^2系数:%.2f" % R2)

# 对数似然函数
log_likelihood = -0.5 * len(residuals) * (1 + np.log(2 * np.pi * mean_residual_sum_of_squares))
print("对数似然函数值:%f" % log_likelihood)

3. F-Test, t-Test

Frage: Warum unterscheiden sich die Testwerte und einige Statistiken oben von denen in der Modellzusammenfassung? Wenn jemand es weiß, kommentieren Sie es bitte im Kommentarbereich.

# # F检验
from scipy.stats import f_oneway
# 合并实际值和预测值为一个数组
all_values = np.concatenate([Y_test, y_pred])
# 创建对应组标签的列表
group_labels = ['Actual'] * len(Y_test) + ['Predicted'] * len(y_pred)
# 进行一元方差分析
f_statistic, p_value = f_oneway(Y_test, y_pred)
print(f"F统计量: {f_statistic}")
print(f"F检验的p值: {p_value}")

# 计算t检验
t_test_results = model.t_test([0, 1])  # 这里假设你对的是截距项和斜率的t检验
# 获取 t 统计量和 p 值
t_statistic = t_test_results.tvalue[0, 0]
t_p_value = t_test_results.pvalue.item()
print(f"t统计量: {t_statistic}")
print(f"t检验的p值: {t_p_value}")

Wenn der p-Wert des F-Tests klein ist (weniger als das festgelegte Signifikanzniveau, z. B. 0,05), kann die Nullhypothese (Nullhypothese) abgelehnt werden, was darauf hinweist, dass das Modell signifikant ist und der Gesamtanpassungseffekt gut ist , Die unabhängige Variable hat einen guten Einfluss auf die Ursache. Variablen haben signifikante Auswirkungen.

4. Konfidenzintervall, Vorhersageintervall

Frage: Gibt es ein Problem beim Ausfüllen des Bildes?

# 计算置信区间和预测区间
confidence_interval = model.get_prediction(X_test_sm).conf_int()
prediction_interval = model.get_prediction(X_test_sm).conf_int(obs=True)
import seaborn as sns
# 可视化拟合图
plt.scatter(X_test, Y_test, color='blue', label='Test Data')  # 测试集散点图
plt.plot(X_test, y_pred, color='red', linewidth=2, label='Fit Line')  # 测试集部分折线图(拟合线)
# 标注置信区间
plt.fill_between(X_test, confidence_interval[:, 0], confidence_interval[:, 1], color='gray', alpha=0.2, label='Confidence Interval')
# 标注预测区间
plt.fill_between(X_test, prediction_interval[:, 0], prediction_interval[:, 1], color='orange', alpha=0.2, label='Prediction Interval')
plt.xlabel('Volume')
plt.ylabel('Price')
plt.title('Price-Volume Data with Confidence and Prediction Intervals')
plt.legend()
plt.show()

5. Restnormalitätstest

①Zeichnen Sie das Restverteilungsdiagramm

import seaborn as sns
from scipy.stats import probplot
# 绘制残差分布图
sns.histplot(residuals, kde=True)
plt.title('Residuals Distribution')
plt.xlabel('Residuals')
plt.ylabel('Frequency')
plt.show()

②Zeichnen Sie das standardisierte Rest-QQ-Diagramm

In der Statistik ist der QQ-Plot (Quantil-Quantil-Plot) ein grafisches Werkzeug , mit dem überprüft werden kann, ob die Stichprobenverteilung der theoretischen Verteilung entspricht . Bei linearen Regressionsmodellen wird der QQ-Plot der standardisierten Residuen verwendet, um zu prüfen, ob die Residuen des Modells annähernd normalverteilt sind.

# 标准化残差的Q-Q图
probplot(residuals, plot=plt)
plt.title('Q-Q Plot of Residuals')
plt.xlabel('Theoretical Quantiles')
plt.ylabel('Sample Quantiles')
plt.show()

Standardisierte Residuen sind die Residuen geteilt durch ihre Standardabweichung, um sicherzustellen, dass sie konsistent skaliert sind. Das QQ-Diagramm standardisierter Residuen zeigt die Verteilung der Residuen durch Vergleich ihrer theoretischen Quantile mit den theoretischen Quantilen einer Standardnormalverteilung. Wenn das QQ-Diagramm der standardisierten Residuen geradlinig verteilt ist, bedeutet dies, dass die Residuen ungefähr der Normalverteilung entsprechen. Wenn eine Krümmung oder Abweichung vorliegt, kann dies darauf hindeuten, dass die Residuen nicht normalverteilt sind.

Im obigen Code probplotwird das QQ-Diagramm der standardisierten Residuen mithilfe der Funktion dargestellt. Die Punkte in der Grafik stellen die beobachteten Werte der standardisierten Residuen dar. Wenn sie auf einer geraden Linie liegen, bedeutet dies, dass die Residuen ungefähr normalverteilt sind . Dieses Diagramm bietet eine intuitive Möglichkeit, die Normalität der Residuen zu überprüfen, und ist ein nützliches Werkzeug, um zu bestimmen, ob das Modell die Normalverteilungsannahme erfüllt.

③Omnibus-Inspektion

# Omnibus检验残差的正态性
omnibus_test = sm.stats.omni_normtest(residuals)
print("Omnibus检验结果:")
print(omnibus_test)

6. Autokorrelationserkennung

①Zeichnen Sie das Autokorrelationsdiagramm

Autokorrelationsdiagramm ist ein grafisches Tool zur Untersuchung der Autokorrelation von Zeitreihendaten . Im Autokorrelationsdiagramm stellt die x-Achse die Verzögerungsordnung (Lag) und die y-Achse den Autokorrelationskoeffizienten dar, der der Verzögerungsordnung entspricht. Dieses Diagramm kann Ihnen helfen zu verstehen, ob in der Zeitreihe eine verzögerte Korrelation besteht.

from statsmodels.graphics.tsaplots import plot_acf
# 绘制自相关图
plot_acf(residuals, lags=20)  # 在lags参数中指定滞后阶数
plt.title('Autocorrelation Plot of Residuals')
plt.xlabel('Lag')
plt.ylabel('Autocorrelation')
plt.show()

Interpretation von Autokorrelationsdiagrammen:

  • Wenn die Punkte im Autokorrelationsdiagramm innerhalb des schattierten Bandes liegen, bedeutet dies, dass keine signifikante Autokorrelation zwischen den Residuen besteht .
  • Wenn die Punkte im Autokorrelogramm außerhalb des schattierten Bandes liegen, kann dies auf eine verzögerte Korrelation zwischen den Residuen hinweisen.
  • Wenn sich die Punkte im Autokorrelogramm oberhalb und unterhalb einer bestimmten Verzögerungsreihenfolge abwechseln, kann dies auf Saisonalität hinweisen.

In Autokorrelationsdiagrammen wird normalerweise ein schattiertes Band angezeigt, das auf ein Konfidenzintervall von 95 % hinweist . Liegt der Autokorrelationskoeffizient innerhalb dieses Konfidenzintervalls, ist er nicht signifikant. Diese liegen offensichtlich innerhalb des schattierten Bandes, was darauf hindeutet, dass zwischen den Residuen keine signifikante Autokorrelation besteht.

②Durbin-Watson-Autokorrelationserkennung

# Durbin-Watson自相关检测
durbin_watson_statistic = sm.stats.durbin_watson(residuals)
print(f"Durbin-Watson统计量: {durbin_watson_statistic}")

Der DW-Wert liegt nahe 2, was darauf hinweist, dass die Sequenz keine Autokorrelation aufweist. Den spezifischen Wertebereich und die Bedeutung finden Sie in früheren Blogs.

Zusammenfassen:

Beim Schreiben dieses Code-Testblogs bin ich auch auf viele Probleme gestoßen. Ich habe Plattformen wie GPT und CSDN um Hilfe gebeten, konnte sie aber nicht lösen. Ich hoffe, sachkundige Blogger können mir wertvolle Meinungen geben! Darüber hinaus können Freunde, die die Messdaten-XLS-Datei benötigen, diese im Kommentarbereich liken und um Hilfe bitten !

Supongo que te gusta

Origin blog.csdn.net/weixin_51658186/article/details/135049600
Recomendado
Clasificación