Mein vorheriger Job war Softwareentwicklung (Java, C #). Dort führten wir auch detaillierte Codeüberprüfungen durch, die auf der Richtlinie zum Schreiben von sauberem und effizientem Code basierten.
Ich bin verantwortlich für Datenanalyse-maschinelles Lernen. Ich werde es in Python schreiben, aber wenn es keine kommerzielle Version ist, gibt es keine Codeüberprüfung und es ist eine Atmosphäre, in der es funktionieren sollte. .. Sicherlich ändern sich das Analyseziel, das Modell und die Parameter häufig, daher denke ich, dass dies das Ergebnis ist, anstatt hart am Design zu arbeiten.
Ich hasse jedoch den Code, der mehrere Modelle (z. B. multiple Regression, SVR, Lasso, RandomForestRegressor) in einem Jupyter-Notizbuch definiert und jedes Modell sendet, und das Trennen von Notizbüchern für jedes Modell verwaltet auch mehr Dateien. Ich hasse es, weil es ein Ärger ist. Daher wird das zu verschiebende Notizbuch nicht manipuliert (um das Ergebnis zu überprüfen), und das Modell wird in der Konfiguration angegeben und ausgeführt, wodurch es ein wenig objektorientiert wird. Ich bin sicher, es gibt Leute, die sagen: "Maschinelles Lernen und Notebook-Modelle sind es nicht." ..
clazz_path = parser.get(path="regression", key="class_path")
model = ClassCreator.create(clazz_path)
[regression]
class_path = utility.SVRModel.SVRModel
import sys
class ClassCreator():
@staticmethod
def create(class_path):
try:
print("class:", class_path)
component_path = str(class_path).split('.')
package_path = component_path[:-1]
package_name = ".".join(package_path)
class_name = component_path[-1]
__import__(str(package_name))
cls = getattr(sys.modules[package_name], class_name)
return cls()
except Exception as e:
print('===Fehlerinhalt===')
print('type:' + str(type(e)))
print('args:' + str(e.args))
print('selbst:' + str(e))
from abc import ABCMeta, abstractmethod
class AbstractModel(metaclass=ABCMeta):
@abstractmethod
def run_grid_search(self, x_train_scaled, y_train):
pass
@abstractmethod
def create_and_pred(self, x_train_scaled, y_train, x_test_scaled):
pass
@abstractmethod
def print_eval(self, x_train_scaled, x_test_scaled, y_train, y_test, df):
pass
@abstractmethod
def get_score(self, x_test_scaled, y_test):
pass
@abstractmethod
def get_rmse(self, y_test, pred):
pass
@abstractmethod
def get_modeltype(self):
pass
@abstractmethod
def get_best_params(self):
pass
from sklearn.svm import SVR
from sklearn.model_selection import GridSearchCV
import numpy as np
from sklearn.metrics import mean_squared_error
from utility.AbstractModel import AbstractModel
class SVRModel(AbstractModel):
def __init__(self):
self.clr = SVR()
self.regr = None
self.grid_search = None
def run_grid_search(self, x_train_scaled, y_train):
param_grid = {'C': [0.005, 0.0075, 0.1, 0.25, 0.4, 0.5, 0.6, 0.75, 1],
'epsilon': [0.000001, 0.00005, 0.00001, 0.0001, 0.0005, 0.001]}
self.grid_search = GridSearchCV(self.clr, param_grid, cv=5)
self.grid_search.fit(x_train_scaled, y_train)
print("best param: {}".format(self.grid_search.best_params_))
print("best score: {}".format(self.grid_search.best_score_))
return self.grid_search
def create_and_pred(self, x_train_scaled, y_train, x_test_scaled):
self.regr = SVR(C=self.grid_search.best_params_["C"], epsilon=self.grid_search.best_params_["epsilon"])
self.regr.fit(x_train_scaled, y_train)
return self.regr.predict(x_test_scaled)
def print_eval(self, x_train_scaled, x_test_scaled, y_train, y_test, df):
if self.regr is None:
raise Exception("needs to run 'create_and_pred' method before call this method.")
print("Passend für Testdaten")
print("Genauigkeit der Trainingsdaten(Entscheidungsfaktor r^2 score,Korrelation) =", self.regr.score(x_train_scaled, y_train))
print("Testen Sie die Genauigkeit der Daten(Entscheidungsfaktor r^2 score,Korrelation) =", self.regr.score(x_test_scaled, y_test))
pred = self.regr.predict(X=x_test_scaled)
print("RMSE:", np.sqrt(mean_squared_error(y_test, pred)))
def get_score(self, x_test_scaled, y_test):
return self.regr.score(x_test_scaled, y_test)
def get_rmse(self, y_test, pred):
return np.sqrt(mean_squared_error(y_test, pred))
def get_modeltype(self):
return type(self.clr)
def get_best_params(self):
return self.grid_search.best_params_
Natürlich denke ich, dass es eine bessere Form gibt. Im Gegensatz zur Systementwicklung handelt es sich um einen Code, der sich mit Versuch und Irrtum wiederholt Ich denke, es ist wichtig, es später nicht zu vergessen.
Mit diesem Formular werde ich versuchen, in Zukunft ein Modell mit Beispieldaten zu erstellen.
Recommended Posts