我应该更改什么来准备我的机器学习模型以在 Flask 中创建 API 以进行 Web 部署
What should I change to prep my machine learning model for creating API in flask for web deployment
我是 ML 的新手,我看过一些教程并建立了我的数据库,经过几次小插曲后,现在一切正常。
现在我需要用这个模型制作一个网络应用程序。
我发现我可以为模型准备添加 pickle 库。问题是我不知道我是否在模型准备方面做得很好。我想从我的数据库中的列中获取信息,这些列在 X 中并获得 3 个输出,其中一个是 Alloy,另外 2 个是 Hours in oven 和 Temper。
所以,想法是从这个模型准备中创建烧瓶 API,以及带有一些 css 样式的简单 html 形式,用户将能够输入 4 个机械要求并获得输出如何实现它们。使用哪种 alloy,在老化炉中使用何种回火和时间。
https://github.com/nemanjaKostovski/MLmodel - 这是我目前所拥有的...
有关详细的迷你环境,您可以查看我的 github 仓库。提前致谢。
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import scikitplot as skplt
import seaborn as sns
df = pd.read_csv('Bazaproizvodnjaprofila1.csv')
X = df[['Rm', 'Rp', 'A%', 'Wb', 'Hours in oven' ]].values
y = df[['Alloy']].values
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2)
print("whole dataset:", X.shape, y.shape)
print("training set:", X_train.shape, y_train.shape)
print("test set:", X_test.shape, y_test.shape)
model = LogisticRegression(max_iter=6500)
model.fit(X_train, y_train.ravel())
y_pred = model.predict(X_test)
print("accuracy:", accuracy_score(y_test, y_pred))
sns.relplot(data=df, x="Rm", y="A%", hue="Alloy", alpha=0.8)
skplt.metrics.plot_confusion_matrix(
y_test,
y_pred,
figsize=(12,12),
text_fontsize=20,
title_fontsize=20)
import pickle
with open('alloys_model.pkl', 'wb') as file:
pickle.dump(model, file)
我觉得还可以。我根据标准和个人喜好对其进行了一些小的调整。继续!也只是一般性建议:
尝试创建一个 holdout 验证集或使用 cross-validation 来衡量准确性或您用来验证模型的任何指标。除非您完全确定您的模型,否则不要跳到甚至触摸测试集。
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import scikitplot as skplt
import seaborn as sns
df = pd.read_csv('Bazaproizvodnjaprofila1.csv')
使用 drop 更有效的方法,你也可以使用 axis = 'columns'(考虑到你正在使用除目标之外的所有功能)
X = df.drop('Alloy', axis=1).values
不用双[]
y = df['Alloy'].values
如果您希望测试集与训练集具有相同的分布,请使用分层。默认测试大小拆分为 0.25,您可以使用 test_size
更改它
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=2)
只是我个人的喜好 - 更整洁
print(f"whole dataset shape: X: {X.shape}, y: {y.shape}")
print(f"Training set shape: X_train: {X_train.shape}, y_train: {y_train.shape}")
print(f"Test set shape: X_test: {X_test.shape}, y_test: {y_test.shape})
model = LogisticRegression(max_iter=6500)
没有双 [] 就不必使用 .ravel()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
classfication 模型的默认评分指标是准确性。原来LogisticRegressionclass中的.score()方法直接调用了sklearn.metrics.accuracy_score方法
print(f'Test Accuracy score: {model.score(X_test, y_test)}')
sns.relplot(data=df, x="Rm", y="A%", hue="Alloy", alpha=0.8)
skplt.metrics.plot_confusion_matrix(
y_test,
y_pred,
figsize=(12,12),
text_fontsize=20,
title_fontsize=20)
我是 ML 的新手,我看过一些教程并建立了我的数据库,经过几次小插曲后,现在一切正常。
现在我需要用这个模型制作一个网络应用程序。 我发现我可以为模型准备添加 pickle 库。问题是我不知道我是否在模型准备方面做得很好。我想从我的数据库中的列中获取信息,这些列在 X 中并获得 3 个输出,其中一个是 Alloy,另外 2 个是 Hours in oven 和 Temper。 所以,想法是从这个模型准备中创建烧瓶 API,以及带有一些 css 样式的简单 html 形式,用户将能够输入 4 个机械要求并获得输出如何实现它们。使用哪种 alloy,在老化炉中使用何种回火和时间。
https://github.com/nemanjaKostovski/MLmodel - 这是我目前所拥有的... 有关详细的迷你环境,您可以查看我的 github 仓库。提前致谢。
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import scikitplot as skplt
import seaborn as sns
df = pd.read_csv('Bazaproizvodnjaprofila1.csv')
X = df[['Rm', 'Rp', 'A%', 'Wb', 'Hours in oven' ]].values
y = df[['Alloy']].values
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2)
print("whole dataset:", X.shape, y.shape)
print("training set:", X_train.shape, y_train.shape)
print("test set:", X_test.shape, y_test.shape)
model = LogisticRegression(max_iter=6500)
model.fit(X_train, y_train.ravel())
y_pred = model.predict(X_test)
print("accuracy:", accuracy_score(y_test, y_pred))
sns.relplot(data=df, x="Rm", y="A%", hue="Alloy", alpha=0.8)
skplt.metrics.plot_confusion_matrix(
y_test,
y_pred,
figsize=(12,12),
text_fontsize=20,
title_fontsize=20)
import pickle
with open('alloys_model.pkl', 'wb') as file:
pickle.dump(model, file)
我觉得还可以。我根据标准和个人喜好对其进行了一些小的调整。继续!也只是一般性建议: 尝试创建一个 holdout 验证集或使用 cross-validation 来衡量准确性或您用来验证模型的任何指标。除非您完全确定您的模型,否则不要跳到甚至触摸测试集。
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import scikitplot as skplt
import seaborn as sns
df = pd.read_csv('Bazaproizvodnjaprofila1.csv')
使用 drop 更有效的方法,你也可以使用 axis = 'columns'(考虑到你正在使用除目标之外的所有功能)
X = df.drop('Alloy', axis=1).values
不用双[]
y = df['Alloy'].values
如果您希望测试集与训练集具有相同的分布,请使用分层。默认测试大小拆分为 0.25,您可以使用 test_size
更改它X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=2)
只是我个人的喜好 - 更整洁
print(f"whole dataset shape: X: {X.shape}, y: {y.shape}")
print(f"Training set shape: X_train: {X_train.shape}, y_train: {y_train.shape}")
print(f"Test set shape: X_test: {X_test.shape}, y_test: {y_test.shape})
model = LogisticRegression(max_iter=6500)
没有双 [] 就不必使用 .ravel()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
classfication 模型的默认评分指标是准确性。原来LogisticRegressionclass中的.score()方法直接调用了sklearn.metrics.accuracy_score方法
print(f'Test Accuracy score: {model.score(X_test, y_test)}')
sns.relplot(data=df, x="Rm", y="A%", hue="Alloy", alpha=0.8)
skplt.metrics.plot_confusion_matrix(
y_test,
y_pred,
figsize=(12,12),
text_fontsize=20,
title_fontsize=20)