import numpy as np
from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error
kfold = KFold(n_splits=5,shuffle=True, random_state=111)
mses = np.zeros((3,5))
k = 10
for i, (train_index, test_index) in enumerate(kfold.split(X_train_sc)):
X_train_sc_train = X_train_sc[train_index]
X_train_sc_holdout = X_train_sc[test_index]
y_train_train = y_train.iloc[train_index]
y_train_holdout = y_train.iloc[test_index]
pred0 = y_train_train.charges.mean()*np.ones(len(test_index))
model1 = LinearRegression()
model2 = KNeighborsRegressor(k)
model1.fit(X_train_sc_train[:,2:], y_train_train)
model2.fit(X_train_sc_train[:,:6], y_train_train)
pred1 = model1.predict(X_train_sc_holdout[:,2:])
pred2 = model2.predict(X_train_sc_holdout[:,:6])
mses[0,i] = mean_squared_error(y_train_holdout, pred0)
mses[1,i] = mean_squared_error(y_train_holdout, pred1)
mses[2,i] = mean_squared_error(y_train_holdout, pred2)
plt.scatter(np.zeros(5), mses[0,:],s=60, c='white', edgecolors='black', label='Single Split')
plt.scatter(np.ones(5), mses[1,:], s=60, c='white', edgecolors='black')
plt.scatter(2*np.ones(5), mses[1,:], s=60, c='white', edgecolors='black')
plt.scatter([0,1,2],np.mean(mses, axis=1),s=60, c='r', marker='X', label='Mean')
plt.legend(loc='upper right', fontsize=12)
plt.xticks([0,1,2],['Baseline','LinReg','KNN Reg'])
plt.yticks(fontsize=10)
plt.ylabel('MSE',fontsize=12)
plt.gca().set_facecolor('#f4f4f4')
plt.gcf().patch.set_facecolor('#f4f4f4')
plt.show()