import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
file_path = r"C:\Users\Emre\Downloads\cleaned_dataset_no_outliers.xlsx"
data = pd.read_excel(file_path)
y = data['Fiyat (TL)']
num_cols = ['Brüt m²', 'Net m²', 'Oda Sayısı Numeric', 'Kat Sayısı Numeric', 'Banyo Sayısı', 'Aidat (TL)', 'Bina Yaşı Ortalama', 'Bulunduğu Kat (Dönüştürülmüş)']
cat_cols = ['Mahalle', 'Isıtma', 'Krediye Uygun', 'Tapu Durumu', 'Kimden', 'Takas', 'Site Adı']
for col in num_cols:
data[col] = pd.to_numeric(data[col], errors='coerce')
data[col] = data[col].fillna(data[col].mean())
for col in cat_cols:
data[col] = data[col].fillna('Belirtilmemiş')
X = data[num_cols + cat_cols]
# 3. Eğitim-test bölme
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
preprocessor = ColumnTransformer(
transformers=[
('num', 'passthrough', num_cols),
('cat', OneHotEncoder(handle_unknown='ignore'), cat_cols)
])
pipeline = Pipeline([
('preprocessor', preprocessor),
('svr', SVR())
])
param_grid = {
'svr__kernel': ['linear', 'rbf', 'poly'],
'svr__C': [0.1, 1, 10, 100],
'svr__gamma': ['scale', 'auto'],
'svr__degree': [3, 4, 5] # Sadece poly kernel için anlamlı
}
# 7. Grid Search (5 kat çapraz doğrulama)
grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='r2', n_jobs=-1, verbose=2)
grid_search.fit(X_train, y_train)
print("En iyi parametreler:", grid_search.best_params_)
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Test Seti MSE: {mse:.2f}')
print(f'Test Seti MAE: {mae:.2f}')
print(f'Test Seti R2: {r2:.2f}')
svr_model = best_model.named_steps['svr']
print(f'Destek Vektörleri Sayısı: {len(svr_model.support_)}')