GitLab wurde erfolgreich aktualisiert. Durch regelmäßige Updates bleibt das THM GitLab sicher. Danke für Ihre Geduld.

Commit f8eabfbc authored by Jens Plüddemann's avatar Jens Plüddemann

commenting

parent 1b6da76f
......@@ -8,102 +8,173 @@ import seaborn as sns
class SalaryData:
def __init__(self, file_path: str):
# Einlesen der CSV Datei
self.df = pd.read_csv(file_path)
# Variablen für Autovervollständigung
self.years = self.df['YearsExperience']
self.salary = self.df['Salary']
def plot_initial(self):
# Plotte die initialen Daten mit x-Achse Zeit und y-Achse Gehalt in einem Streudiagramm
plt.scatter(self.years, self.salary, label='initial data')
# Kosmetische Eigenschaften des Plots
plt.xlabel('Years of experience')
plt.ylabel('Salary')
plt.title('Years of experience vs salary')
plt.legend()
# Zeige alle Plots
plt.show()
def pearson_correlation_coefficient(self):
# Berechne den Korrelationskoeffizienzen anhand der Bibliothek Numpy
# [1, 0] gibt uns den 0-ten Wert aus der zweiten Zeile
r = np.corrcoef(self.years, self.salary)[1, 0]
print(r)
def linear_regression(self):
# Errechne die einzelnen Bestandteile der Gleichung, genauso wie auf den Folien beschrieben
b1_nominator = np.sum((self.years - np.mean(self.years)) * (self.salary - np.mean(self.salary)))
b1_denominator = np.sum((self.years - np.mean(self.years)) ** 2)
b1 = b1_nominator / b1_denominator
b0 = np.mean(self.salary) - b1 * np.mean(self.years)
# Schreibe die Ergebnisse in die Konsole
print(f'Slope = {b1}')
print(f'Intercept = {b0}')
def linear_regression_sklearn(self):
# Erstellen eines neuen LinearRegression Objekt mittels Statsmodels
# Füge die einzelnen Spalten hinzu
# Werte werden in der Form [[..], [..]] erwartet, sind aber [.., ..], deswegen Reshape
regressed_data = LinearRegression().fit(self.years.to_numpy().reshape(-1, 1),
self.salary.to_numpy().reshape(-1, 1))
# Schreibe die Ergebnisse in die Konsole
print(f'Slope = {regressed_data.coef_[0][0]}')
print(f'Intercept = {regressed_data.intercept_[0]}')
def linear_regression_statsmodels(self):
# Erstellen eines neuen Ordinary Least Squares Objekts
# Füge die Daten dem Modell hinzu
# keine weiteren Anpassungen notwendig, da ols ein Dataframe erwartet
regressed_data = ols('Salary ~ YearsExperience', data=self.df).fit().params
# Schreibe die Ergebńisse in die Konsole
print(f'Slope = {regressed_data[1]}')
print(f'Intercept = {regressed_data[0]}')
def plot_regression(self):
# Erstellen eines neuen LinearRegression Objekt mittels Statsmodels
# Füge die einzelnen Spalten hinzu
# Werte werden in der Form [[..], [..]] erwartet, sind aber [.., ..], deswegen Reshape
reg_sl = LinearRegression().fit(self.years.to_numpy().reshape(-1, 1), self.salary.to_numpy().reshape(-1, 1))
# Erstellen eines neuen Ordinary Least Squares Objekts
# Füge die Daten dem Modell hinzu
# keine weiteren Anpassungen notwendig, da ols ein Dataframe erwartet
reg_sm = ols('Salary ~ YearsExperience', data=self.df).fit()
# Plotte die initialen Daten
plt.scatter(self.years, self.salary, label='initial data')
# Plotte die SkLearn Daten
plt.plot(self.years, reg_sl.predict(self.years.to_numpy().reshape(-1, 1)), label='regression sklearn')
# Plotte die Statsmodels Daten
plt.plot(self.years, reg_sm.predict(self.years), label='regression statsmodels')
# Kosmetische Eigenschaften des Plots
plt.title('Salary vs experience')
plt.xlabel('Years of experience')
plt.ylabel('Salary')
plt.legend()
# Zeige alle Plots
plt.show()
def evaluate_model(self):
# Erstellen eines neuen LinearRegression Objekt mittels Statsmodels
# Füge die einzelnen Spalten hinzu
# Werte werden in der Form [[..], [..]] erwartet, sind aber [.., ..], deswegen Reshape
reg_sl = LinearRegression().fit(self.years.to_numpy().reshape(-1, 1), self.salary.to_numpy().reshape(-1, 1))
# Rechne den Mean square error aus
# Werte werden in der Form [[..], [..]] erwartet, sind aber [.., ..], deswegen Reshape
# Formel wie auf den Folien
# 5**2 = 5^2
mse = np.sum(
(reg_sl.predict(self.years.to_numpy().reshape(-1, 1)) - self.salary.to_numpy().reshape(-1, 1)) ** 2) / len(
self.salary)
# Errechne den Root Mean Square Error
rmse = np.sqrt(mse)
# Errechne ssres wie auf den Folien gezeigt
# 5**2 = 5^2
ssres = np.sum(
(reg_sl.predict(self.years.to_numpy().reshape(-1, 1)) - self.salary.to_numpy().reshape(-1, 1)) ** 2)
# Errechne sstot wie auf den Folien gezeigt
# 5**2 = 5^2
sstot = np.sum((self.salary - np.mean(self.salary)) ** 2)
# Errechne r^2
r_squared = 1 - (ssres / sstot)
# Schreibe die Ergebnisse zur Konsole
print(f'RMSE: {rmse}')
print(f'R-squared: {r_squared}')
print(f'R-squared sklearn: {reg_sl.score(self.years.to_numpy().reshape(-1, 1), self.salary.to_numpy().reshape(-1, 1))}')
# Mittels der Bibliothek Seaborn erstelle ein Residualsplot
sns.residplot(x='YearsExperience', y='Salary', data=self.df, label='residuals')
# Cosmetics
plt.title('Residual plot')
plt.xlabel('Fitted values')
plt.ylabel('Residuals')
plt.legend()
# Zeige alle Plots
plt.show()
def predict_the_result(self):
# Erstellen eines neuen LinearRegression Objekt mittels Statsmodels
# Füge die einzelnen Spalten hinzu
# Werte werden in der Form [[..], [..]] erwartet, sind aber [.., ..], deswegen Reshape
reg_sl = LinearRegression().fit(self.years.to_numpy().reshape(-1, 1), self.salary.to_numpy().reshape(-1, 1))
# Erstelle Test Daten
X_test = np.array([[3.0], [2.5], [10.0], [20.0]])
# Vorhersagen für die Test Daten
y_prediction = reg_sl.predict(X_test)
# Schreibe die Ergebnisse zur Konsole
print(f'Predictions: {y_prediction}')
if __name__ == '__main__':
data_set = SalaryData('../../res/Salary_Data.csv')
# Kommentiere einzelne Funktionen aus um diese zu benutzen
data_set.plot_initial()
data_set.pearson_correlation_coefficient()
data_set.linear_regression()
data_set.linear_regression_sklearn()
data_set.linear_regression_statsmodels()
data_set.plot_regression()
data_set.evaluate_model()
data_set.predict_the_result()
# data_set.pearson_correlation_coefficient()
# data_set.linear_regression()
# data_set.linear_regression_sklearn()
# data_set.linear_regression_statsmodels()
# data_set.plot_regression()
# data_set.evaluate_model()
# data_set.predict_the_result()
......@@ -4,6 +4,8 @@ from sklearn.preprocessing import scale, MinMaxScaler
class ScalingData:
def __init__(self):
# Erstellen eines Arrays an Werten
self.data = np.array([
[1, -10, 0],
[20, 0, 0.3],
......@@ -11,11 +13,14 @@ class ScalingData:
])
def scale_data(self):
# Skalieren der Daten mittels der Bibliothek SkLearn
scaled_data = scale(self.data)
print(scaled_data)
def min_max_scale_data(self):
# Scalieren der Daten zwischen 0 und 1 mittels der Bibliothek SkLearn
min_max_scaled_data = MinMaxScaler().fit_transform(self.data)
print(min_max_scaled_data)
......
......@@ -4,12 +4,19 @@ from sklearn.model_selection import train_test_split
class SplittingData:
def __init__(self):
# Erstellen von 2 Listen
self.x, self.y = np.arange(10).reshape((5, 2)), list(range(5))
# Zeigen der beiden Listen
print(self.x)
print(self.y)
def splitting_data(self):
# Spalten der Daten in Trainings und Test Daten
# test_size gibt dabei die Verteilung an
# random_state ist ein Seed und sorg für betreutes Zufällig
X_train, X_test, y_train, y_test = train_test_split(self.x, self.y, test_size=0.33, random_state=42)
print('\nSplitted data')
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment