본문 바로가기
Machine Learning/LightGBM

Data I/O for LightGBM (with R)

by 찐남 2022. 1. 12.

LightGBM에 필요한 데이터 I/O 함수

 

lgb.Dataset(): lgb.Dataset 객체 생성

조밀한 행렬, 희소 행렬 또는 로컬 파일(이전에 lgb.Dataset을 저장하여 생성)에서 lgb.Dataset 객체를 구성합니다.

lgb.Dataset(
  data,
  params = list(),
  reference = NULL,
  colnames = NULL,
  categorical_feature = NULL,
  free_raw_data = TRUE,
  label = NULL,
  weight = NULL,
  group = NULL,
  init_score = NULL
)
  • Arguments
    • data: matrix 객체, dgCMatrix 객체, 텍스트 파일(CSV, TSV 또는 LibSVM)의 경로를 나타내는 문자, 또는 바이너리 lgb.Dataset 파일의 경로를 나타내는 문자
    • params: 매개변수 리스트
    • reference: 참조 데이터 세트. LightGBM은 데이터 세트를 생성할 때 연속형 feature를 히스토그램으로 binning 하는 것과 같은 일부 전처리를 수행합니다. 기존 데이터 세트의 동일한 빈 경계를 새 데이터에 적용하려면 기존 데이터 세트를 이 인수에 전달해야 합니다.
    • colnames: 열 이름
    • categorical_feature: 범주형 feature. feature 이름의 문자 벡터 또는 feature 인덱스가 있는 정수 벡터(예: "첫 번째 및 열 번째 열"을 나타내는 c(1, 10)). 
    • free_raw_data: LightGBM은 표 데이터에서 "데이터 세트"라고 하는 데이터 형식을 구성합니다. 기본적으로 R 측의 Dataset 개체는 원시 데이터의 복사본을 유지하지 않습니다. 이렇게 하면 LightGBM의 메모리 소비가 줄어들지만 Dataset 개체가 구성된 후에는 변경할 수 없습니다. 생성 후 Dataset 개체를 변경할 수 있도록 하려면 free_raw_data = FALSE로 설정
    • label: target 변수로 사용할 라벨 벡터 
    • weight: 표본 가중치로 구성된 숫자형 벡터
    • group: 순위 지정 작업에 사용됩니다. 순위를 지정할 동일한 후보 결과 집합의 정렬된 결과로 행을 그룹화하는 방법을 설명하는 정수 벡터입니다. 예를 들어 그룹이 c(10, 20, 40, 10, 10, 10)인 100개의 문서 데이터 세트가 있는 경우 이는 6개의 그룹이 있음을 의미합니다. 여기서 처음 10개의 레코드는 첫 번째 그룹에 있고, 11-30은 두 번째 그룹 등에 속합니다.
    • init_score: 초기 점수는 lightgbm이 부스트할 기본 예측입니다.
  • value: constructed dataset
# 사용예시
data(bank, package = "lightgbm")  # lightgbm 패키지에 있는 bank 데이터 세트 가져오기 

y <- as.numeric(bank$y == "yes")   # target 변수 숫자형 변환
X <- data.matrix(bank[, c("age", "balance", "previous")]) # 데이터 프레임을 매트릭스로 변환

train_x <- X[1:2521,]        # temp train data
test_x <- X[-(1:2521),]       # temp test data 

train_y <- X[1:2521,]        # temp train label
test_y <- X[-(1:2521),]      # temp test label

dtrain <- lgb.Dataset(train_x,label = train_y)

 

 


 

lgb.Dataset.construct(): 데이터 세트를 명시적으로 구성

lgb.Dataset.construct(dataset)
  • Arguments
    • dataset: lgb.Dataset 클래스 개체
  • value: constructed dataset

 

lgb.Dataset.create.valid(): 훈련 데이터에 따른 검증 데이터 구축

lgb.Dataset.create.valid(
  dataset,
  data,
  label = NULL,
  weight = NULL,
  group = NULL,
  init_score = NULL,
  params = list()
)
  • Arguments
    • dataset: lgb.Dataset 클래스 개체
    • data: matrix 객체, dgCMatrix 객체, 텍스트 파일(CSV, TSV 또는 LibSVM)의 경로를 나타내는 문자, 또는 바이너리 lgb.Dataset 파일의 경로를 나타내는 문자
    • label: target 변수로 사용할 라벨 벡터 
    • weight: 표본 가중치로 구성된 숫자형 벡터
    • group: 순위 지정 작업에 사용됩니다. 순위를 지정할 동일한 후보 결과 집합의 정렬된 결과로 행을 그룹화하는 방법을 설명하는 정수 벡터입니다. 예를 들어 그룹이 c(10, 20, 40, 10, 10, 10)인 100개의 문서 데이터 세트가 있는 경우 이는 6개의 그룹이 있음을 의미합니다. 여기서 처음 10개의 레코드는 첫 번째 그룹에 있고, 11-30은 두 번째 그룹 등에 속합니다.
    • init_score: 초기 점수는 lightgbm이 부스트 할 기본 예측입니다.
    • params: 매개변수 리스트
  • value: constructed dataset
# 사용 예시
dtest <- lgb.Dataset.create.valid(dataset = dtrain, data = test_x, label = test_y)

 

lgb.Dataset.save(): lgb.Dataset을 바이너리 파일에 저장

init_score는 바이너리 파일에 저장되지 않습니다. 필요한 경우 Dataset을 불러온 후 다시 설정해 주세요.

lgb.Dataset.save(dataset, fname)
  • Arguments
    • dataset: lgb.Dataset 클래스 개체
    • fname: 출력 파일의 개체 파일 이름
  • value: 전달한 데이터 세트
# 사용 예시
lgb.Dataset.save(dtrain, tempfile(fileext = ".bin"))

 

lgb.Dataset.set.categorical(): lgb.Dataset의 범주형 feature 설정

lgb.Dataset 객체의 범주형 feature를 설정합니다.

이 기능을 사용하여 범주형으로 처리되어야 하는 기능을 LightGBM에 알립니다.

lgb.Dataset.set.categorical(dataset, categorical_feature)
  • Arguments
    • dataset: lgb.Dataset 클래스 개체
    • categorical_feature: 범주형 feature들. feature name의 문자 벡터 또는 feature 인덱스가 있는 정수 벡터(예: "첫 번째 및 열 번째 열"을 나타냄:(1L, 10L)).
  • value: 전달한 데이터 세트
# 사용 예시
lgb.Dataset.set.categorical(dtrain, "previous")

 

 

lgb.Dataset.set.reference(): lgb.Dataset의 참조 설정

검증 데이터를 사용하려면 훈련 데이터에 대한 참조를 설정해야 합니다.

lgb.Dataset.set.reference(dataset, reference)
  • Arguments
    • dataset: lgb.Dataset 클래스 개체
    • reference: lgb.Dataset 클래스 개체
  • value: 전달한 데이터 세트
# 사용 예시
lgb.Dataset.set.reference(dataset = dtest, reference = dtrain)

 

lgb.convert_with_rules(): 규칙이 있는 LightGBM 데이터 세트용 데이터 준비자(정수)

lgb.Dataset에 넣을 준비를 위해 깨끗한 데이터 세트를 준비하려고 시도합니다. factor, 문자 및 논리 열을 정수로 변환합니다. factor 및 문자의 누락된 값은 0으로 채워집니다. 논리에서 누락된 값은 -1로 채워집니다. 이 함수는 열의 값을 변환하는 방법을 정확히 설명하는 "규칙"을 반환하고 선택적으로 가져옵니다. NA 값만 포함하는 열은 이 함수에 의해 변환되지만 반환된 규칙에는 표시되지 않습니다.

lgb.convert_with_rules(data, rules = NULL)
  • Arguments
    • data: data.frame 또는 data.table
    • rules: 이미 사용 중인 경우 데이터 준비자의 규칙 집합입니다. 이것은 이름이 데이터의 열 이름이고 값이 이름이 열 값이고 값이 대체할 새 값인 이름이 지정된 문자 벡터인 R 목록이어야 합니다.
  • value: 정리된 데이터 세트(데이터) 및 규칙(규칙)이 포함된 list. lgb.Dataset에 입력하려면 데이터를 행렬 형식(as.matrix)으로 변환해야 합니다.
# 사용 예시
data(iris)
str(iris)

new_iris <- lgb.convert_with_rules(data = iris)
str(new_iris$data)

data(iris) # iris dataset 삭제
iris$Species[1L] <- "NEW FACTOR" # Introduce junk factor (NA)
# 알려진 규칙을 사용하여 변환
# 알 수 없는 요인은 0이 되며 희소 데이터 세트에 적합
newer_iris <- lgb.convert_with_rules(data = iris, rules = new_iris$rules)
head(newer_iris$data)
(첫번째 데이터의 Species 값이 0으로 변환됨)

newer_iris$data[1, 5] <- 1.0 # 실제 초기값 되돌리기

# 새로 생성된 데이터 세트가 동일한가요? YES!
all.equal(new_iris$data, newer_iris$data)
# 우리 자신의 규칙을 테스트할 수 있습니까?
data(iris) # Erase iris dataset

# 값을 다르게 재 맵핑
personal_rules <- list(
  Species = c(
    "setosa" = 3L
    , "versicolor" = 2L
    , "virginica" = 1L
  )
)
newest_iris <- lgb.convert_with_rules(data = iris, rules = personal_rules)
str(newest_iris$data) # 성공

 

 

dim(<lgb.Dataset>): lgb.Dataset의 차원

  • Arguments: lgb.Dataset 클래스 개체
  • Value: 행 개수와 열 개수로 구성된 벡터
  • Details: Note - nrow 및 ncol은 내부적으로 dim을 사용하므로 lgb.Dataset 객체와 함께 직접 사용 가능
# 사용 예시

data(bank, package = "lightgbm")  # lightgbm 패키지에 있는 bank 데이터 세트 가져오기
y <- as.numeric(bank$y == "yes")   # target 변수 숫자형으로 세팅
X <- data.matrix(bank[, c("age", "balance", "previous")])   # X 변수 세팅

dtrain <- lgb.Dataset(X, label = y)  # lightgbm 패키지 활용을 위한 데이터 세트 세팅
dim(dtrain)
row: 4521 column: 2

 

dimnames(<lgb.Dataset>) `dimnames<-`(<lgb.Dataset>) : lgb.Dataset의 열 이름 처리

(lgb.Dataset에는 열 이름만 지원되므로 행 이름 설정은 영향을 미치지 않으며 반환되는 행 이름은 NULL이 됩니다.)

# S3 method for lgb.Dataset
# dimnames(x)

# S3 method for lgb.Dataset
# dimnames(x) <- value
  • Arguments
    • x: lgb.Dataset 클래스 개체
    • value: 두 개의 요소를 가지는 list - 첫 번째 요소는 무시되고 두 번째 요소는 열 이름입니다.
  • Value: 데이터 세트의 차원 이름이 포함된 list
  • Details: 일반 dimnames 메서드는 colnames에서 사용됩니다. 행 이름은 관련이 없으므로 colname을 직접 사용하는 것이 좋습니다.
# 사용 예시

dimnames(dtrain)

colnames(dtrain)

 

get_field(dataset, field_name): lgb.Dataset의 속성 하나 가져오기

  • Arguments
    • dataset: lgb.Dataset 클래스 개체
    • field_name: 가져올 속성의 이름이 있는 문자열입니다. 다음 중 하나입니다.
      1. label: lightgbm이 학습하는 라벨
      2. weight: 가중치 재조정을 하기 위해
      3. group: 순위 지정 작업에 사용됩니다. 순위를 지정할 동일한 후보 결과 집합의 정렬된 결과로 행을 그룹화하는 방법을 설명하는 정수 벡터입니다. 예를 들어 그룹이 c(10, 20, 40, 10, 10, 10)인 100개의 문서 데이터 세트가 있는 경우 이는 6개의 그룹이 있음을 의미합니다. 여기서 처음 10개의 레코드는 첫 번째 그룹에 있고, 11-30은 두 번째 그룹 등에 속합니다.
      4. init_score: 초기 점수는 lightgbm이 부스트 할 기본 예측입니다.
  • Value: 요구된 속성
# 사용 예시
labels <- lightgbm::get_field(dtrain, "label")
labels

 

set_field(dataset, field_name, data): lgb.Dataset의 속성 하나 설정하기

  • Arguments
    • dataset: lgb.Dataset 클래스 개체
    • field_name: 가져올 속성의 이름이 있는 문자열입니다. 다음 중 하나입니다.
      1. label: lightgbm이 학습하는 라벨
      2. weight: 가중치 재조정을 하기 위해
      3. group: 순위 지정 작업에 사용됩니다. 순위를 지정할 동일한 후보 결과 집합의 정렬된 결과로 행을 그룹화하는 방법을 설명하는 정수 벡터입니다. 예를 들어 그룹이 c(10, 20, 40, 10, 10, 10)인 100개의 문서 데이터 세트가 있는 경우 이는 6개의 그룹이 있음을 의미합니다. 여기서 처음 10개의 레코드는 첫 번째 그룹에 있고, 11-30은 두 번째 그룹 등에 속합니다.
      4. init_score: 초기 점수는 lightgbm이 부스트할 기본 예측입니다.
    • data: The data for the field
  • Value: 전달한 lgb.Dataset
# 사용 예시
lightgbm::set_field(dtrain, "label", 1 - labels)    # binary target 0 -> 1 / 1 -> 0 수정

 

slice(dataset, idxset): Slice a dataset

Get a new lgb.Dataset containing the specified rows of original lgb.Dataset object

  • Arguments
    • dataset: lgb.Dataset 클래스 개체
    • idxset: 필요한 행 인덱스의 정수 벡터
  • value: 구성된 하위 데이터 세트
dsub <- lightgbm::slice(dtrain, seq_len(42))  # lgb.Dataset 인 dtrain에서 1 ~ 42번째 데이터만 가져오기
dim(dsub) # error
lgb.Dataset.construct(dsub)  # call lgb.Dataset.construct explicitly 
dim(dsub)

 

반응형

댓글