위도 및 경도 Feature Engineering 케이스 정리

Data Setup

import polars as pl  
from xgboost import XGBRegressor  
from sklearn.linear_model import Ridge  
  
  
# Data taken from https://www.openml.org/search?type=data&id=43093  
df = (  
	pl.scan_csv("../data/miami-housing.csv")  
	.with_columns([  
		pl.col("SALE_PRC").alias("price"),  
		pl.col(["LATITUDE", "LONGITUDE"]).name.to_lowercase()  
	])  
	.select(pl.col(["latitude", "longitude", "price"]))  
)

TRAIN_TEST_SPLIT_FRACTION = 0.8  
  
df = (  
	df  
	  
	# Shuffle the data to avoid any issues from the data being pre-ordered...  
	.sample(fraction=1, shuffle=True)  
	  
	# ...then use row numbers as an index for separating train and test.  
	.with_row_count(name="row_number")  
	.with_columns([  
	(pl.col("row_number") < TRAIN_TEST_SPLIT_FRACTION * len(df)).alias("is_train")  
	])  
)

Feature Engineering

  • Raw Latitude and Longitude
  • Spatial Density
    • Population density is correlated with many demographic processes, and this is certainly true for rental prices and incomes.
    • Approach
      • One could use many methods for measuring the spatial density around a home: counting the number of other home sales within some radius of each home sale
      • or computing and sampling from a Kernel Density Estimate over home sale locations
      • or even pulling third party census data about population density.
    • Case(scipy's CKDTree 이용해서 Density Feature 생성)

def add_density_feature_columns_to_dataframe(geo_df: pl.DataFrame) -> pl.DataFrame:  
	tree = spatial.cKDTree(df.select(["latitude", "longitude"]))  
	result = geo_df.with_columns(  
	pl.Series(  
	"spatial_density",  
	tree.query_ball_point(geo_df.select(["latitude", "longitude"]), .005, return_length=True)  
	)  
	)  
	return result  
  
  
df_w_density = add_density_feature_columns_to_dataframe(df)
  • Geohash Target Encoding(Ref)
    • It’s a known fact — some neighborhoods are more expensive than others. So, it’s possible that giving information to the model about each home’s neighborhood (and the sale price that can be expected in that neighborhood) can add predictive power.
    • A neighborhood can be anything — a zip-code, a street, or in our case, a Geohash.
def add_geohash_column_to_df(geo_df: pl.DataFrame) -> pl.DataFrame:  
	result = (  
	df  
		.with_columns(  
			df  
				.select("latitude", "longitude")  
				.map_rows(  
					lambda x: geohash2.encode(x[0], x[1], precision=5),  
					return_dtype=pl.Utf8  
			)  
		.rename({"map": "geohash"})  
		)  
	)  
	return result  
  
def add_target_encoding_to_df(  
		dataframe: pl.DataFrame,  
		categorical_column: str = "geohash"  
	) -> pl.DataFrame:  
		category_target_means = (  
		dataframe  
		.filter(pl.col("is_train")) # Only include train data to prevent test data leakage.  
		.group_by(categorical_column)  
		.agg(  
			pl.col(MODEL_TARGET).mean().alias(f"{categorical_column}_{MODEL_TARGET}_mean")  
		)  
	)  
	result = (  
		dataframe  
		.join(  
			category_target_means,  
			how="left",  
			on=categorical_column  
		)  
	)  
	return result  
  
df_w_geohash = add_geohash_column_to_df(df)  
df_w_geohash_target_encoded = add_target_encoding_to_df(df_w_geohash)

Reference

Read more

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성은 잘못된 인과추론 결과를 만들어낼 수 있습니다.

다중공선성(Multi Collinearity) * **Multi-Collinearity(다중공선성)**는 독립 변수들 간의 강한 상관관계가 존재할 때 발생합니다. 즉, 한 독립 변수가 다른 독립 변수에 의해 설명될 수 있을 정도로 상관관계가 높은 상황을 의미합니다. * 이 문제는 주로 회귀 분석에서 나타나며, 변수들 간의 관계를 해석하는 데 있어 큰 장애물이 될 수 있습니다. * 일반적인 회귀식을 $Y=

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P-Value는 불확실성을 감안하여 모델의 적합도를 평가합니다.

Bayesian P- Value * Bayesian P-Value는 **모델의 적합도(goodness-of-fit)**를 평가하는 데 사용됩니다. * 사후 분포(posterior distribution)를 이용하여 실제 데이터와 모델이 생성한 예상 데이터를 비교함으로써, 관측된 데이터가 모델에 의해 얼마나 잘 설명되는지를 평가합니다. * 빈도주의 p-값은 "관찰된 데이터보다 극단적인 데이터가 나올 확률"을 계산하지만, Bayesian P-Value는 "모델이 실제

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non-Identifiability는 Model Parameter를 고유하게 식별할 수 없는 현상입니다.

Non Identifiability * Non-Identifiability는 주어진 데이터와 모델에 대해 특정 파라미터를 고유하게 식별할 수 없는 상황을 의미합니다. 즉, 여러 파라미터 값들이 동일한 데이터를 생성할 수 있으며, 이로 인해 특정 파라미터 값을 확정적으로 추정하기 어렵게 됩니다. * 베이지안 추론에서 Non-Identifiability는 사후 분포가 특정 파라미터 값에 대해 명확하게 수렴하지 않고, 여러 값들에 대해 비슷한 확률을

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram은 큰 분산을 갖거나 비정규 형태의 데이터를 위한 히스토그램입니다.

Rootgram * 히스토그램의 변형으로 데이터가 비정규적이거나 큰 분산을 가지는 경우, 정확한 분포를 파악하기 위해 사용됩니다. * 일반적으로 히스토그램은 데이터의 빈도를 직접적으로 나타내기 때문에, 큰 값이 빈번하게 발생하는 경우 상대적으로 작은 값을 잘 드러내지 못하는 경향이 있습니다. 반면, Rootgram은 빈도를 제곱근 형태로 변환하여, 데이터 분포의 차이를 더 잘 시각화할 수 있도록 돕습니다 * 여기서