다음과 같은 표가 있습니다 (예제 행).
|---------------------|------------------|---------------|
| Color | Size | Age |
|---------------------|------------------|---------------|
| Green | Small | Young |
|---------------------|------------------|---------------|
테이블에는 세 가지 색상 (녹색, 파란색, 노란색), 세 가지 크기 (소형, 중형, 대형) 및 세 가지 연령 (젊음, 중년, 노인)의 수천 개의 인스턴스가 있습니다.
또한 각 열에 대해 미리 정의 된 백분율 / 비율 집합이 있습니다. 예를 들면 :
색상 : 30 % 파란색, 40 % 녹색, 30 % 노란색
크기 : 25 % 소형, 50 % 중형, 25 % 대형
나이 : 45 % 젊음, 45 % 중년 나이, 10 % 나이
내 질문 : 위의 비율에 맞는 가장 큰 데이터 세트를 어떻게 만들 수 있습니까?
언더 샘플링 기법 (즉, 과중 된 값이있는 행을 삭제하는 것)이 앞으로의 길인 것 같지만, 각 행이 내가 제어하는 세 가지 변수 모두에 영향을 미치기 때문에 어려운 일을 발견하고 있습니다.
최종 결과는 위에 정의 된 비율에 맞는 가능한 가장 큰 데이터 세트입니다.
감사합니다!
해당 행에 대한 값 가중치의 곱에 비례하는 확률로 각 행을 샘플링해야합니다. 예를 들어 설명하기가 더 쉽습니다.
N = 100000
# generate N samples of each category; "Color" is sampled non-uniformly to
# illustrate how to account for prior distribution
df = pd.DataFrame({
'Color': np.random.choice(['blue', 'green', 'yellow'], N, p=[0.9, 0.05, 0.05]),
'Size': np.random.choice(['small', 'medium', 'large'], N),
'Age': np.random.choice(['young', 'middle-age', 'old'], N),
})
# target value distribution (e.g., in the final data set, we want 30% blue,
# 40% green, 30% yellow)
target_weights = {
'Color': pd.Series({'blue': 30, 'green': 40, 'yellow': 30}),
'Size': pd.Series({'small': 25, 'medium': 50, 'large': 25}),
'Age': pd.Series({'young': 45, 'middle-age': 45, 'old': 10}),
}
먼저 사전 분포로 정규화합니다. 직관적으로 이전 값 빈도에 대한 목표 값 빈도 의 비율 에 비례하는 확률로 샘플링하려고합니다 .
target_weights['Color'] /= df.Color.value_counts()
target_weights['Size'] /= df.Size.value_counts()
target_weights['Age'] /= df.Age.value_counts()
그런 다음 각 행에 대한 샘플링 확률을 계산합니다.
sample_prob = (
df.Color.map(target_weights['Color']) *
df.Size.map(target_weights['Size']) *
df.Age.map(target_weights['Age'])
)
sample_prob.head()
0 3.354744e-10
1 6.184742e-09
2 3.390995e-10
3 3.396480e-10
4 6.647330e-10
dtype: float64
이 시점에서 df
확률로 각 행을 샘플링 sample_prob
하면 원하는 분포가 생성됩니다. 상수로 샘플링 확률을 스케일링해도 여전히 목표 분포가 생성됩니다. 가능한 가장 큰 샘플을 얻으려면 최대 샘플링 확률을 가진 행이 항상 샘플링 되는지 확인하십시오 .
sample_prob /= sample_prob.max()
그런 다음 해당 확률로 각 행을 샘플링합니다.
df_sampled = df.loc[np.random.random(df.shape[0]) < sample_prob]
배포가 올바른지 확인할 수 있습니다.
df_sampled.Color.value_counts(normalize=True)
green 0.400585
yellow 0.304341
blue 0.295074
Name: Color, dtype: float64
df_sampled.Size.value_counts(normalize=True)
medium 0.497805
large 0.253130
small 0.249065
Name: Size, dtype: float64
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다