import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import mglearn
Übung 2
Lineare Modelle zur Regression und Klassifikation - Monte-Carlo Simulation
Python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
# set default values for all plotting:
=12
size'axes.labelsize'] = size
plt.rcParams['xtick.labelsize'] = size
plt.rcParams['ytick.labelsize'] = size
plt.rcParams['legend.fontsize'] = size
plt.rcParams['figure.figsize'] = 6.29, 6/10*6.29
plt.rcParams['lines.linewidth'] = 1
plt.rcParams['axes.grid'] = True
plt.rcParams[# print(plt.rcParams)
# import locale #should you want german notation for numbers, then use the locale package
# locale.setlocale(locale.LC_ALL, "deu_deu")
# plt.rcParams['axes.formatter.use_locale'] = True
# Stylefile
# plt.style.use('C:/Users/edel/Documents/Python Scripts/Stylefile/custom_figure_style.mplstyle')
import warnings
"ignore") warnings.filterwarnings(
Linear Models for Regression
Übung 1: Lineare Regression von Energiedaten
Fitten Sie ein lineares Regressionsmodell in die Daten der Datei ENERGY.DAT
, und stellen Sie Ihr Ergebnis grafisch dar. Verwenden Sie dazu den Scikit-Learn Algorithmus LinearRegression
Lösung:
= pd.read_csv("daten/ENERGY.DAT", delim_whitespace= True, index_col=0)
df 'RGDP'] = df['RGDP']/1000
df['EN'] = df['EN']/1000
df[
= df['RGDP'].values.reshape(-1,1) # makes it a 2-dim-array
X = df['EN'] # 1-dim array for target vextor is OK too
y
# we use a split, but could have used the whole data X, y for demonstration too:
= train_test_split(X, y, random_state=0)
X_train, X_test, y_train, y_test
= LinearRegression()
lr
lr.fit(X_train, y_train)
print("Linear Regression:")
print(f"- Training set score: {lr.score(X_train, y_train):.2f}")
print(f"- Test set score: {lr.score(X_test, y_test):.2f}")
Linear Regression:
- Training set score: 0.96
- Test set score: 0.89
= np.linspace(0, 800, 1000) # 1-dim array
line = np.reshape(line, (-1, 1)) # makes it a 2-dim-array, needed for feature matrix
line
plt.figure()'RGDP'], df['EN'], color='red', label='Daten')
plt.scatter(df[='black', label='Vorhersagemodell')
plt.plot(line, lr.predict(line),color'RGDP')
plt.xlabel('EN')
plt.ylabel(
plt.legend()True)
plt.grid( plt.tight_layout()
Aufgabe 1: Korrelation und \(R^2\)-Wert
Zeigen Sie an den wave
-Daten, die Sie mit X, y = mglearn.datasets.make_wave()
laden können, den allgemeinen Zusammenhang, dass im Fall eines einzigen Features die Korrelation \(\text{corr}(y, x_1)\) zwischen Targetvektor \(y\) und Featurevektor \(x_1\) mit dem \(R^2\)-Wert des Fits der linearen Regression \(y \sim x_1\) wie folgt in Beziehung steht:
\[R^2 = \left[\text{corr}(y, x_1)\right]^2\]
Hinweise: Verwenden Sie die Funktion corrcoef
.
Lösung:
= mglearn.datasets.make_wave(n_samples=100)
X, y = train_test_split(X, y, random_state=42)
X_train, X_test, y_train, y_test
= LinearRegression().fit(X_train, y_train)
lr
= lr.score(X_train, y_train)
R2
= np.corrcoef(y_train, X_train.flatten()) # .flatten() makes it a 1-dim array
Rho = Rho[0, 1]
rho
- rho**2 R2
-2.220446049250313e-16
plt.figure()='red',marker='.')
plt.scatter(X,y,color'X-Achse')
plt.xlabel('Y-Achse')
plt.ylabel(True)
plt.grid( plt.tight_layout()
Aufgabe 2: Lineare Regression der Boston House Prices
Verwenden Sie den extended Boston House Prices Datensatz.
- Erstellen Sie eine lineare Regression mit allen Features und testen Sie das Modell an Testdaten. Ist Ihr lineares Modell evtl. over- oder underfitted?
- Vergleichen Sie das Ergebnis der linearen Regression mit jener einer kNN-Regression mit 5 Nachbarn.
- Verwenden Sie eine Lasso-Regression und finden Sie einen optimalen Wert des Regularisierungsparameters.
- Vergleichen Sie die Regressionskoeffizienten der linearen Regression und der Lasso-Regression über ‘stem’-Plots. Was fällt Ihnen dabei auf?
Lösung:
= mglearn.datasets.load_extended_boston()
X, y = train_test_split(X, y)
X_train, X_test, y_train, y_test
print(X.shape)
print(y.shape)
= LinearRegression()
lr
lr.fit(X_train, y_train)
print("Linear Regression:")
print(f"- Training set score: {lr.score(X_train, y_train):.2f}")
print(f"- Test set score: {lr.score(X_test, y_test):.2f}")
(506, 104)
(506,)
Linear Regression:
- Training set score: 0.93
- Test set score: 0.73
= KNeighborsRegressor(n_neighbors=5)
reg
reg.fit(X_train, y_train)
print("kNN-Regression:")
print(f"- Training set score: {reg.score(X_train, y_train):.2f}")
print(f"- Test set score: {reg.score(X_test, y_test):.2f}")
kNN-Regression:
- Training set score: 0.83
- Test set score: 0.77
=[]
Train_scores=[]
Test_scores=np.logspace(-5,5,11)
alphas
for i in range(len(alphas)):
= Lasso(alphas[i])
lasso
lasso.fit(X_train,y_train)
Train_scores.append(lasso.score(X_train,y_train)) Test_scores.append(lasso.score(X_test,y_test))
plt.figure()='red',label='Train-Score Lasso')
plt.semilogx(alphas,Train_scores,color='blue',label='Test-Score Lasso')
plt.semilogx(alphas,Test_scores,color='black',ls='dashed',label='KNN')
plt.axhline(reg.score(X_test,y_test),color='black',ls='solid',label='Linear Regression')
plt.axhline(lr.score(X_test,y_test),color0,1)
plt.ylim('Alpha (-)')
plt.xlabel('Coefficient of Determination')
plt.ylabel(
plt.legend()
plt.tight_layout()'Regression_Comparison.jpg',dpi=600) plt.savefig(
=0.01
alpha_opt=Lasso(alpha=alpha_opt)
lasso_opt lasso_opt.fit(X_train,y_train)
Lasso(alpha=0.01)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Lasso(alpha=0.01)
=plt.figure(figsize=(6.29,1.2*6.29))
fig=fig.add_subplot(2,1,1)
ax=fig.add_subplot(2,1,2,sharex=ax)
ax2
='Lineare Regression')
ax.stem(np.concatenate( ([lr.intercept_], lr.coef_) ),label# plt.ylim(-20, 20)
ax.legend()True)
ax.grid(
='Lasso Regression, α={:.2f}'.format(alpha_opt))
ax2.stem(np.concatenate( ([lasso_opt.intercept_], lasso_opt.coef_) ),label# plt.ylim(-20, 20)
'Feature')
ax2.set_xlabel(
ax2.legend()True) ax2.grid(
Übung 2: Verteilung der Scores, Arithmetisch gemittelter Score
Versuchen Sie die folgende Funktion nachzuvollziehen. Darin werden für einen definierten Algorithmus verschiedene Train_Test_Splits gemacht, um generelle Aussagen über die Qualität einer Vorhersage zu bekommen.
- Verwenden Sie die folgende Funktion, um sich für 50 unterschiedliche Splits die Testscores sowie den mittleren Score zu berechnen.
- Stellen Sie die Testscores in Abhängigkeit der Anzahl der Splits dar.
- Erstellen Sie einen vertikalen KDE (kernel density estimation) - Plot mit dem Seaborn-Paket (sns.kdeplot)
=10
n_splits
def Algo_Scores(algo_sel=LinearRegression()):
=[]
Test_Scoresfor i in range(n_splits):
= train_test_split(X, y)
X_train, X_test, y_train, y_test =algo_sel
algo
algo.fit(X_train,y_train)
Test_Scores.append(algo.score(X_test,y_test))=np.mean(Test_Scores)
Mean_Test_Scorereturn [Test_Scores,Mean_Test_Score]
=Algo_Scores()[0]
LR_Test_Scores=Algo_Scores()[1]
LR_Test_Meanprint(LR_Test_Mean)
0.8018757007168894
=np.arange(0,n_splits,1)
t
plt.figure()='red',label='Test Scores')
plt.scatter(t,LR_Test_Scores,color='black',ls='solid',label='Mean Test Score')
plt.axhline(LR_Test_Mean,color'Splits')
plt.xlabel('Testscore')
plt.ylabel(0,1)
plt.ylim(
plt.legend() plt.tight_layout()
plt.figure()=25,color='red',density=True,histtype='stepfilled',orientation='horizontal')
plt.hist(LR_Test_Scores,bins'Number')
plt.xlabel('Testscore')
plt.ylabel(0,1)
plt.ylim( plt.tight_layout()
plt.figure()='red',vertical=True,label='Scores',fill=True)
sns.kdeplot(LR_Test_Scores,color='black',label='Mean Score')
plt.axhline(LR_Test_Mean,color'Number')
plt.xlabel('Testscore')
plt.ylabel(0,1)
plt.ylim(
plt.legend() plt.tight_layout()
Linear Models for Classification
Aufgabe 3: Iris-Datensatz mit LogisticRegression und LinearSVC
Verwenden Sie den Iris Datensatz und untersuchen Sie die Performance des LogisticRegression und des LinearSVC Klassifizierers für unterschiedliche Regularisierungsparameterwerte und mehrere Train-Test-Splits.
Lösung:
= load_iris()
iris_dataset
= 'Logistic Regression'
algorithm #algorithm = 'Linear SVC'
= np.logspace(-2, 6, num=9)
C_values = 50
number_of_splits
= []
mean_scores_train = []
mean_scores_test
for C in C_values:
= []
scores_train = []
scores_test for i in range(number_of_splits):
= train_test_split(iris_dataset['data'], iris_dataset['target'])
X_train, X_test, y_train, y_test if algorithm == 'Logistic Regression':
= LogisticRegression(C=C, max_iter=1000, penalty="l2", solver='liblinear',
algo ='ovr').fit(X_train, y_train)
multi_classelif algorithm == 'Linear SVC':
= LinearSVC(C=C, penalty="l2", dual=False, max_iter=1000).fit(X_train, y_train)
algo
scores_train.append(algo.score(X_train, y_train))
scores_test .append(algo.score(X_test , y_test ))
mean_scores_train.append(np.mean(scores_train))
mean_scores_test .append(np.mean(scores_test ))
plt.figure()
plt.title(algorithm)='black',ls='solid',marker='.', label='Trainscore')
plt.semilogx(C_values, mean_scores_train, color='red',ls='dashed',marker='.',label='Testscore')
plt.semilogx(C_values, mean_scores_test , color'Komplexitätsparameter C')
plt.xlabel('Mittlerer Score')
plt.ylabel(
plt.legend()True)
plt.grid( plt.tight_layout()