In [11]:
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
In [12]:
#1. Load dataset
housing = fetch_california_housing()
df = pd.DataFrame(housing.data, columns=housing.feature_names)
df['Target'] = housing.target
In [13]:
# 2. Selecct two features
X = df[['MedInc', 'HouseAge']]
y = df['Target']
In [14]:
# 3. Train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42)
In [15]:
# 4. Scale features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
In [16]:
# 5. Loop over k values
k_values = range(1, 51)
mse_list = []
r2_list = []
for k in k_values:
knn = KNeighborsRegressor(n_neighbors = k)
knn.fit(X_train_scaled, y_train)
y_pred = knn.predict(X_test_scaled)
mse_list.append(mean_squared_error(y_test, y_pred))
r2_list.append(r2_score(y_test, y_pred))
In [17]:
#6. Plot MSE vs k
plt.figure(figsize=(6,4))
plt.plot(k_values, mse_list, marker='o')
plt.xlabel('Number of Neighbors (k)')
plt.ylabel('Mean Squared Error')
plt.title('MSE vs k for KNN Regression')
plt.grid(True)
plt.show()
In [18]:
#7. Plot R^2 vs k
plt.figure(figsize = (6, 4))
plt.plot(k_values, r2_list, marker='o', color='green')
plt.xlabel('Number of Neigbors (k)')
plt.ylabel('R^2 Score')
plt.title('R^2 vs k for KNN Regression')
plt.grid(True)
plt.show()
In [19]:
# 8. Print best k based on R^2
best_k = k_values[np.argmax(r2_list)]
print(f"Best k based on highest R^2 Score: {best_k} (R^2 = {max(r2_list):.4f})")
Best k based on highest R^2 Score: 50 (R^2 = 0.5285)