import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split from sklearn.linear_model import Ridge import matplotlib.pyplot as plt filename = "mobiles.csv" # Считываем данные из файла в DataFrame data = pd.read_csv(filename, sep=',') # Удаляем столбец с идентификатором data.pop("Id") # Приведение строковых значений признаков к численным при помощи векторайзера с суммированием FEATURE_COLUMNS_TO_PROC = ['Name', 'Brand', 'Model', 'Operating system'] for column_name in FEATURE_COLUMNS_TO_PROC: vectorizer = TfidfVectorizer() train_text_feature_matrix = vectorizer.fit_transform(data[column_name]).toarray() a = pd.DataFrame(train_text_feature_matrix) data[column_name] = a[a.columns[1:]].apply(lambda x: sum(x.dropna().astype(float)), axis = 1) # Приведение строковых значений к численным при помощи числового кодирования LabelEncoder le = LabelEncoder() data['Touchscreen'] = le.fit_transform(data['Touchscreen']) data['Wi-Fi'] = le.fit_transform(data['Wi-Fi']) data['Bluetooth'] = le.fit_transform(data['Bluetooth']) data['GPS'] = le.fit_transform(data['GPS']) data['3G'] = le.fit_transform(data['3G']) data['4G/ LTE'] = le.fit_transform(data['4G/ LTE']) # В Y помещаем целевой признак - цену Y = data['Price'] # В X помещаем остальные признаки X = data.drop(columns='Price') # Разделение данных на обучающую (99%) и тестовую (1%) выборки X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.01, random_state=42) # Гребневая регрессия ridge = Ridge(alpha=1.0) # Обучение модели ridge.fit(X_train, y_train) # Предсказание на тестовых данных y_pred_ridge = ridge.predict(X_test) # Оценка модели на тестовых данных (коэффициент детерминации) ridge_score = ridge.score(X_test, y_test) print("Оценка работы модели гребневой регрессии:") print("Коэффициент детерминации: %f" % ridge_score) plt.figure(1, figsize=(12, 7)) plt.title('Сравнение ожидаемых и фактических результатов предсказания цены телефона') plt.scatter(x=[i for i in range(len(X_test))], y=y_test, c='green', s=8) plt.scatter(x=[i for i in range(len(X_test))], y=y_pred_ridge, c='red', s=8) plt.savefig('plot.png') plt.show()