Проблема: количество строк в необработанных данных составляет более 100 000. Но мне нужно проанализировать два ограниченных района с двумя истинными значениями в каждом.
Я использовал обучение без учителя (кластеризация KMeans), начальную загрузку и намеренно задал шум, чтобы соответствовать модели. Но, похоже, это не работает. Может ли кто-нибудь подсказать мне, как с этим справиться?
Мой инструктор хочет, чтобы я построил регрессионную модель.
Но кажется, что это невозможно, как и сказал ChatGPT 20 раз.Код (y с произвольным шумом, 97,8% r2_score для каждых двух кластеров, но отклонен):
Код: Выделить всё
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")
\# loading data rest_data_path = '서울시 휴게음식점 인허가 정보.csv'
one_person_data_path = '1인가구(연령별).csv'
rest_data = pd.read_csv(rest_data_path, encoding='utf-8')
one_person_data = pd.read_csv(one_person_data_path, encoding='utf-8')
# preprocessing data
one_person_data = one_person_data.rename(columns={'자치구별(2)': '자치구'})
one_person_data_cleaned = one_person_data[one_person_data['자치구'] != '자치구별(2)']
one_person_data_cleaned['2023_합계'] = one_person_data_cleaned.loc[:, '2023':'2023.15'].apply(
pd.to_numeric, errors='coerce').sum(axis=1)
one_person_summary = one_person_data_cleaned[['자치구', '2023_합계']]
rest_data_cleaned = rest_data.rename(columns={'지번주소': '주소'})
rest_data_cleaned['자치구'] = rest_data_cleaned['주소'].str.split(' ').str[1]
merged_data = pd.merge(rest_data_cleaned, one_person_summary, on='자치구', how='left')
# add noise
np.random.seed(42)
noise = np.random.normal(0, 0.05 * merged_data['2023_합계'].std(), size=merged_data.shape[0])
merged_data['y'] = merged_data['2023_합계'] + noise
# save data
result_continuous = merged_data[['자치구', '주소', '2023_합계', 'y']].dropna()
# output
result_continuous'
< /code>
output < /strong> < /p>
자치구 주소 2023_합계 y
\5 Кванакгу, Сеул 1562-17 Пончхондон, Кванакгу, Сеул 159036.0 158422.996610
\6 Кванакгу, Сеул 1562-17 Пончхондон, Кванакгу, особый город 142454.0 146588.600626
\18 Кванак-гу, Сеул 1538-14 Силлим-дон, Кванак-гу, Сеул 159036.0 156658.665625
\19 Кванак-гу 1538-14 Силлим-дон, Кванакгу, Сеул 142454.0 138756.390843
\46 Кванак-гу 1519-22 Силлим-дон, Кванак-гу, Сеул 159036.0 157829.983096
\... ... ... ... . ..
\142131 Апартаменты Donga Cheongsol, 808 Чанг-дон, Добонг-гу, Сеул, Добонг-гу Комната 209, торговый корпус 46250.0 43593.821116
\142138 Кванак-гу, Сеул 1458-4 Силлим-дон, Кванак-гу, Сеул Сентервилль 13th 159036.0 157758.991278
\142139 Кванак- гу, Сеул Кванак-гу Силлим-дон 1458-4 Centerville 13th 142454.0 140637.617424
\142142 Кванак-гу Сеул 928-1 Пончхон-дон, здание Кванак-гу Ухён 159036.0 158889.888720
\142143 Гванак- гу Здание Ухён, 928-1 Пончхондон, Кванакгу, Сеул 142454.0 142926.767535
\14162 строки × 4 столбца\
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import StandardScaler
columns_to_encode = ['자치구']
columns_to_exclude = ['2023_합계']
encoder = OneHotEncoder(sparse_output=False) # drop='first'로 다중공선성 방지
encoded_columns = encoder.fit_transform(result_continuous[columns_to_encode])
encoded_column_names = encoder.get_feature_names_out(columns_to_encode)
encoded_df = pd.DataFrame(encoded_columns, columns=encoded_column_names, index=result_continuous.index)
processed_data = result_continuous.drop(columns=columns_to_encode + columns_to_exclude)
final_data = pd.concat([processed_data, encoded_df], axis=1)
final_data['주소_hash'] = result_continuous['주소'].apply(hash)
final_data = final_data.drop(columns=['주소']) # 원래 주소 열 제거
y = np.log1p(final_data[['y']])
final_data.drop(['y'], axis=1, inplace=True)
scaler = StandardScaler()
final_data_scaled = scaler.fit_transform(final_data)
final_data_scaled, y
< /code>
output < /strong> < /p>
(array([[ 0.72281968, -0.72281968, 1.14388039],
[ 0.72281968, -0.72281968, 1.14388039],
[ 0.72281968, -0.72281968, -0.74799056],
...,
[ 0.72281968, -0.72281968, 0.60622321],
[ 0.72281968, -0.72281968, 0.14385426],
[ 0.72281968, -0.72281968, 0.14385426]]),`
y
5 11.973030
6 11.895392
18 11.961831
19 11.840482
46 11.969280
... ...
142131 10.682694
142138 11.968830
142139 11.853949
142142 11.975973
142143 11.870095
[14162 rows x 1 columns]
Подробнее здесь: https://stackoverflow.com/questions/793 ... ore-than-4