테일-센(Theil-Sen)이란? AI에서 여러 부분 표본의 중앙값으로 수치를 예측하는 방법
TL;DR
테일-센(Theil-Sen)은 여러 부분 표본에서 구한 선형 계수를 중앙값 방식으로 결합하는 강건 회귀 방법입니다. 입력 특징이 하나인 기본 형태는 서로 다른 두 점의 기울기를 모아 중앙값을 구합니다. scikit-learn은 여러 특징과 절편을 공간 중앙값으로 함께 다룹니다. 일부 이상치의 영향을 줄이지만 특징 수와 조합 수가 늘면 강건성과 계산 비용을 따로 확인해야 합니다.
핵심 3줄 요약
- 핵심 1
여러 추정값의 중심을 찾습니다. 기본 형태는 점 쌍의 기울기 중앙값, 다변량 구현은 계수 벡터의 공간 중앙값을 씁니다. - 핵심 2
부분 표본 크기가 성질을 바꿉니다. 한 번에 쓰는 표본 수와 계산할 조합 수는 서로 다른 설정이며 강건성과 실행 시간에 영향을 줍니다. - 핵심 3
이상치 삭제나 예측 구간은 아닙니다. 학습 계수의 안정성, 원본 데이터의 오류 여부, 새 관측값의 불확실성을 구분해 검증합니다.
이 글에서 다룰 내용
- 테일-센의 한 문장 정의
- 다섯 관측값으로 이해하는 기울기 중앙값
- 부분 표본과 공간 중앙값의 작동 방식
- 표본 크기·조합 한도·반복 설정의 뜻
- 후버 회귀·RANSAC·SciPy 구현과의 차이
- 실전 사용처와 검증 체크리스트
- 고차원·신뢰구간·원본 오류의 주의점
테일-센을 한 문장으로 정의하면 무엇인가요?
테일-센은 데이터의 여러 작은 부분에서 선형 관계를 추정하고, 그 추정값을 중앙값으로 모아 일부 극단적인 관측에 덜 흔들리게 만드는 회귀 방법입니다.
회귀의 정답은 시간·수량처럼 연속적인 숫자입니다. 테일-센은 정답이 붙은 자료로 입력과 결과의 선형 관계를 배웁니다. 라벨 없는 자료를 묶는 군집화나 새로운 문장을 생성하는 LLM 학습 방식과는 목적이 다릅니다.
중앙값은 값을 순서대로 놓았을 때 가운데에 있는 값입니다. 큰 숫자 하나가 평균을 많이 움직이는 상황에서도 중앙값은 상대적으로 덜 움직입니다. 테일-센은 이 성질을 관측값 자체가 아닌 여러 기울기나 계수 추정값에 적용합니다.
한 줄 정리: 하나의 선을 전체 자료에 바로 맞추기보다, 작은 자료에서 얻은 여러 선의 계수를 중앙값 방식으로 결합합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 입력값과 처리 시간의 관계를 본다고 가정해 보겠습니다. 설명용으로 만든 입력은 1, 2, 3, 4, 5이고 처리 시간은 3, 5, 7, 9, 30입니다. 마지막 관측만 앞선 흐름에서 크게 벗어납니다. 실제 서비스의 측정 기록이나 성능 비교 결과는 아닙니다.
서로 다른 입력값을 가진 두 점을 골라 시간 차이를 입력 차이로 나눕니다. 다섯 점에서 나오는 점 쌍은 10개입니다. 앞의 네 점끼리 만든 여섯 기울기는 모두 2이고, 마지막 점이 포함된 나머지 네 기울기는 더 큽니다. 정렬된 기울기의 가운데 두 값도 2이므로 중앙값은 2입니다.
같은 자료를 실제로 계산하면 SciPy의
theilslopes(y, x, method="joint")
는 기울기 2와 절편 1을 반환합니다. 일반 최소제곱 회귀의 기울기는 5.8로 더 크게 기웁니다. 이 예시는 중앙값 원리를 확인한 계산이며, 테일-센이 모든 데이터에서 더 정확하다는 증거는 아닙니다.
scikit-learn의
TheilSenRegressor
는 기울기만 따로 정렬하지 않고 절편과 기울기를 묶은 공간 중앙값을 반복 계산합니다. 같은 자료에서도 허용 오차에 따라 결과가 조금 다를 수 있습니다. 이름이 같다고 두 라이브러리의 수치가 완전히 일치해야 하는 것은 아닙니다.
쉬운 예시: 몇 개의 크게 기울어진 후보가 섞여도, 여러 후보의 가운데를 고르면 전체 흐름에 가까운 기울기가 남을 수 있습니다.
왜 AI에서 테일-센이 중요한가요?
일부 극단값이 선형 추정을 흔드는 정도를 살핍니다
일반 최소제곱은 잔차의 제곱합을 줄이므로 큰 오차가 계수에 강하게 영향을 줍니다. 테일-센은 부분 표본별 추정값을 모으는 방식을 써 오염된 관측이 최종 계수를 흔드는 정도를 줄입니다. 입력 X의 이상과 정답 y의 이상을 구분해 비교하는 것도 도움이 됩니다.
강건 회귀의 선택 근거를 분리합니다
scikit-learn의 공식 합성 데이터 예제는 입력 쪽과 정답 쪽에 이상치를 넣어 일반 회귀·테일-센·RANSAC을 비교합니다. 특정 예제에서 선이 덜 흔들렸다는 사실을 실제 자료의 성능 순위로 옮기지는 않습니다. 같은 검증 분할에서 예측 오차와 중요한 사례를 따로 살펴야 합니다.
테일-센은 어떤 순서로 작동하나요?
1. 계수를 구할 부분 표본을 정합니다
기본 단변량 형태에서는 입력값이 서로 다른 점 쌍으로 기울기를 만듭니다. 다변량 형태는 여러 특징의 계수를 구할 만큼의 행을 선택합니다. scikit-learn에서 절편까지 학습하면 한 부분 표본에는 적어도 특징 수에 1을 더한 수의 행이 필요합니다.
2. 각 부분 표본에서 최소제곱 해를 구합니다
선택한 행마다 같은 크기의 계수 벡터를 얻습니다. 각 벡터에는 특징별 기울기와 필요한 경우 절편이 들어갑니다. 조합이 너무 많으면 전부 계산하는 대신 무작위로 고른 일부 조합을 사용합니다. 입력의 중복과 선형 종속도 확인해 추정이 불안정한 부분이 없는지 살핍니다.
3. 공간 중앙값으로 계수를 결합합니다
공간 중앙값은 계수 벡터들까지의 유클리드 거리 합을 줄이는 중심입니다. 기울기마다 별도의 숫자 중앙값을 낸 것과 일반적으로 같지 않습니다. 최종 계수와 절편을 새 입력에 적용해 수치를 예측합니다. 여러 모델의 예측을 단순 평균하는 배깅과도 결합 방식이 다릅니다.
핵심 인사이트: 부분 표본마다 구한 계수와 그 계수들을 모으는 규칙을 함께 봐야 테일-센의 작동 방식을 이해할 수 있습니다.
주요 설정과 결과는 어떻게 읽나요?
n_subsamples는 한 번에 사용하는 행 수입니다
n_subsamples
는 각 최소제곱 계산에 들어가는 표본 수입니다. 기본
n_subsamples=None
은 허용되는 최소 크기를 선택합니다. 작게 잡을 때와 크게 잡을 때 강건성과 통계적 효율의 관계가 달라집니다. 단순히 많이 넣을수록 이상치에 강해진다고 해석하지 않습니다.
이 값을 전체 학습 표본 수로 정하면 scikit-learn 문서상 일반 최소제곱과 같아집니다. 모든 부분 표본에 전체 자료가 들어가므로 중앙값으로 결합할 서로 다른 추정값이 남지 않기 때문입니다. 절편을 끄면 최소 표본 수의 조건도 달라집니다.
max_subpopulation은 계산할 조합 수를 제한합니다
max_subpopulation
은 한 번에 쓰는 행 수가 아닌, 고려할 부분 표본 조합의 최대 규모입니다. 가능한 조합이 이 한도보다 많으면 무작위로 일부를 선택합니다. 한도를 줄이면 계산 부담을 낮추지만 모든 조합을 사용했을 때의 성질을 그대로 보장하지는 않습니다.
random_state
는 무작위 조합 선택을 재현할 때 기록합니다. 학습 뒤
n_subpopulation_
으로 실제 고려한 조합 수를 확인하세요. 이 숫자를 학습에 남긴 행 수나 새 입력을 평가한 건수로 읽으면 안 됩니다.
반복 상태와 예측 점수는 서로 다릅니다
max_iter
와
tol
은 공간 중앙값 계산의 반복 한도와 허용 오차입니다.
n_iter_
는 그 계산의 반복 횟수이며 데이터를 몇 번 모두 학습했는지를 뜻하는 에폭 수가 아닙니다. 경고와 종료 상태를 보되 반복이 끝났다는 이유만으로 검증 성능이 좋다고 판단하지 않습니다.
coef_
와
intercept_
는 학습된 계수와 절편입니다.
breakdown_
는 근사적인 붕괴점 정보이며 실제 데이터에서 오류인 행의 비율이 아닙니다.
score
는 결정계수 R²이므로 강건 손실이나 예측 신뢰구간과 구분합니다.
실전 팁: 한 부분 표본의 행 수와 전체 후보 조합 수를 각각 적으세요. 두 설정을 한 가지 샘플 크기로 뭉뚱그리면 속도와 강건성의 변화를 설명하기 어렵습니다.
테일-센과 헷갈리는 용어는 무엇이 다른가요?
후버 회귀와 테일-센의 차이
후버 회귀는 작은 잔차에는 제곱 손실을 쓰고 큰 잔차에는 선형 손실을 적용합니다. 테일-센은 부분 표본에서 구한 계수를 중앙값으로 모읍니다. 둘 다 강건 회귀지만 손실의 모양을 바꾸는 방법과 추정값을 결합하는 방법을 같은 절차로 보지 않습니다.
RANSAC과 테일-센의 차이
RANSAC은 무작위 후보 모델과 잔차 기준으로 합의하는 표본을 찾고, 선택한 인라이어에서 최종 모델을 맞춥니다. 테일-센은 계수 후보의 공간 중앙값을 구합니다.
TheilSenRegressor
가 RANSAC의
inlier_mask_
처럼 확정된 합의 행 목록을 반환한다고 가정하지 않습니다.
SciPy의 기울기 추정과 다변량 모델의 차이
SciPy의
theilslopes
는 하나의 입력과 결과에서 점 쌍의 기울기 중앙값을 구하는 함수입니다. scikit-learn의
TheilSenRegressor
는 여러 입력 특징을 다루는 회귀 추정기입니다. 어떤 쪽을 쓰는지에 따라 중앙값의 대상, 절편 계산과 반환값의 뜻을 따로 확인합니다.
SciPy에서
method="joint"
는 기울기를 적용하고 남은 값의 중앙값으로 절편을 구합니다. 기본
method="separate"
는 y의 중앙값에서 기울기와 x의 중앙값의 곱을 뺍니다. 기울기가 같아도 절편 계산 규칙에 따라 예측선이 달라질 수 있습니다.
비교 정리: 후버는 잔차 손실 조정, RANSAC은 합의 집합 선택, 테일-센은 여러 계수의 중앙값 결합이 중심입니다. 구현별 절편과 출력도 별도로 읽습니다.
실전에서는 어디에 쓰이나요?
수치 특징의 강건한 비교 모델로 사용합니다
센서 특징으로 처리 시간을 예측하는 것처럼 선형 관계를 먼저 점검할 때 후보로 비교합니다. 특징과 표본이 많지 않은 자료에서 계산 부담을 살피기 좋습니다. 성능 우위를 미리 정하지 말고 일반 최소제곱과 같은 검증 자료의 오차를 비교하세요.
관측값에 따른 추세의 민감도를 확인합니다
특이한 관측 몇 개를 확인하면서 계수의 방향이 크게 달라지는지 조사할 때 씁니다. 한 입력의 추세 기울기만 필요하면 SciPy 함수와 반환 구간의 뜻을 먼저 볼 수 있습니다. 시간 순서가 있는 자료라면 독립된 관측이라는 가정과 반복 측정 구조도 별도로 검토합니다.
실전 팁: 강건 모델의 선만 저장하지 말고 원본 표본 ID, 기준 회귀선, 오차가 큰 사례와 계산 시간을 함께 남기세요.
테일-센을 적용할 때 어떤 순서로 확인하나요?
1. 입력과 예측 대상의 단위를 맞춥니다
한 행이 장비 하나인지 특정 시점의 관측인지 정합니다. 입력과 정답의 순서, 누락과 중복, 같은 입력값의 반복을 확인하세요. 큰 값이 잘못된 측정인지 중요한 실제 사건인지 판단할 원본 기록도 보관합니다.
2. 검증 자료와 전처리를 분리합니다
훈련과 검증을 먼저 나눕니다. 결측값 대체나 스케일링에 필요한 통계는 훈련 분할에서 구하세요. 입력 단위가 크게 다른 특징은 계수 크기와 공간 중앙값 해석에 영향을 줄 수 있으므로 전처리 규칙과 최종 모델을 함께 기록합니다.
3. 표본 크기와 실행 부담을 확인합니다
특징 수,
fit_intercept
,
n_subsamples
,
max_subpopulation
을 한 묶음으로 적습니다. 작은 자료에서 걸린 시간과 고려한 조합 수, 경고를 확인한 뒤 전체 자료를 처리합니다. 조합 한도와 시드를 바꿨을 때 계수와 예측이 얼마나 달라지는지도 비교합니다.
4. 같은 자료에서 기준 모델과 대조합니다
같은 입력·분할·지표로 일반 회귀와 강건 회귀를 평가합니다. 전체 평균 오차뿐 아니라 원본을 검토한 극단 사례의 오차도 따로 봅니다. 강건한 계수가 업무상 중요한 드문 사건을 놓치는지 확인하고 모델 선택의 이유를 남깁니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 고차원에서도 강건성이 유지된다고 가정하지 않습니다. scikit-learn 안내는 특징 수가 커지면 테일-센의 강건성이 빠르게 약해진다고 설명합니다. 많은 특징을 넣은 상태에서 알고리즘 이름만 보고 이상치에 안전하다고 결론 내리지 않습니다.
둘째, 조합 한도는 계산과 추정의 조건을 함께 바꿉니다. 일부 무작위 조합만 계산하는 경우에는 전체 조합을 계산하는 경우와 결과가 달라질 수 있습니다. 적은 조합으로 빨리 끝났다는 사실과 계수·예측이 안정적이라는 사실은 따로 확인합니다.
셋째, 기울기의 신뢰구간을 새 예측값의 범위로 읽지 않습니다. SciPy의
low_slope
와
high_slope
는 기울기의 신뢰구간 경계입니다. 절편의 신뢰구간이나 새 관측값의 예측 구간을 함께 반환하는 것은 아닙니다. 두 기울기로 선을 그렸다고 전체 예측 구간이 완성되지는 않습니다.
넷째, 선형 모델의 한계를 남겨 둡니다. 비모수적인 추정이라는 설명은 입력과 결과의 모든 곡선을 자유롭게 학습한다는 뜻이 아닙니다. 관계가 휘거나 그룹마다 규칙이 다르면 선형 관계 자체가 맞는지 다시 살펴야 합니다.
다섯째, 특이한 관측을 자동 삭제하지 않습니다. 테일-센으로 얻은 계수나 붕괴점만으로 어느 행이 오류인지 확정하지 않습니다. 극단값이 실제 장애·수요 급증이라면 그 사건을 별도로 다루는 평가가 필요합니다.
주의: 이상치에 덜 흔들리는 추정과 잘못된 원본을 고치는 일은 별개입니다. 계산 결과에 원본 검토와 독립된 검증을 덧붙이세요.
자주 묻는 질문
Q1. 테일-센은 기울기 평균을 구하는 방법인가요?
기본 단변량 형태는 점 쌍 기울기의 중앙값을 구합니다. 다변량 구현은 계수 벡터의 공간 중앙값을 사용합니다. 기울기 평균이나 각 계수의 개별 중앙값과 같은 계산으로 취급하지 않습니다.
Q2. 모든 특징을 따로 테일-센에 넣으면 같은 모델인가요?
아닙니다. 특징마다 따로 구한 기울기는 나머지 특징을 함께 고려한 다변량 계수와 다릅니다. scikit-learn 추정기는 선택한 부분 표본에서 여러 계수와 절편을 함께 구합니다.
Q3. 부분 표본을 크게 잡으면 언제나 더 강건한가요?
그렇지 않습니다. 표본 크기는 강건성과 효율의 관계를 바꿉니다. 전체 행을 한 부분 표본으로 쓰면 일반 최소제곱과 같아집니다. 더 많은 조합을 계산하는 설정과도 구분하세요.
Q4. SciPy와 scikit-learn의 결과가 조금 다르면 오류인가요?
반드시 오류는 아닙니다. 기울기 중앙값과 공간 중앙값의 차이, 절편 규칙과 반복 허용 오차를 확인합니다. 비교하려는 입력, 전처리, 절편 옵션과 구현 버전도 맞춰 봅니다.
Q5. 기울기 신뢰구간으로 미래 처리 시간 범위를 만들 수 있나요?
기울기 구간만으로 충분하지 않습니다. SciPy의 반환값에는 절편 구간과 새 관측의 잡음을 반영한 예측 구간이 없습니다. 예측 불확실성은 목적에 맞는 별도의 방법으로 평가합니다.
Q6. 강건 회귀면 원본 이상치 검토를 생략해도 되나요?
안 됩니다. 수집 오류와 드문 정상 사건은 같은 극단값으로 보일 수 있습니다. 원본과 업무 기록을 대조하고 중요한 사건의 예측이 나빠지지 않았는지도 확인하세요.
출처
마무리
테일-센은 여러 부분 표본에서 추정한 선형 계수를 중앙값 방식으로 결합하는 강건 회귀입니다. 기본 기울기 중앙값과 다변량 공간 중앙값을 구분하고, 부분 표본 크기·조합 한도·반복 상태를 함께 읽으면 구현 문서를 이해하기 쉽습니다.
처음 비교한다면 원본 단위와 검증 분할을 고정하고 일반 회귀와 같은 자료에서 시험하세요. 고차원 한계, 중요한 극단 사례의 오차, 기울기 구간과 예측 구간의 차이를 확인하는 것이 모델 이름보다 중요합니다.
