정수인코딩한 것을 int 데이터들과 학습시키기 위해서는 어떻게 바꿔줘야 할까요?

조회수 633회

이미지

현재 쇼핑몰 랭킹순위를 모델 시키는 것이 목표이고 학습을 시켜서 rank가 어떻게 나올까를 하는게 최종 목표입니다. 현재 보이시는 범주 중에서 encoding name은 상품의 제목을 토큰화후 정수 인코딩 한 것입니다.

현재 이상태에서 Linear Regression으로 모델학습 시켜주려고 하는데, 아무래도 정수 인코딩으로 인해 ValueError: could not convert string to float: [[1]] 와 같은 오류가 뜨게 됩니다.

정수 인코딩한 것을 같이 학습시켜주기 위해선 어떻게 변환하여 모델을 돌려줘야 할까요 알려주시면 정말 감사하겠습니다.


import pandas as pd
from sklearn.preprocessing import PowerTransformer
from sklearn.compose import make_column_transformer
from sklearn.linear_model import LinearRegression

데이터 불러오기 및 정규화

train_df = pd.read_csv("/정수화된거 추가2.csv",encoding='UTF-8')
test_df = pd.read_csv("/정수화된거 추가2_test.csv",encoding='UTF-8')
print(train_df.info())
search_df = train_df[(train_df['price']==0) & (train_df['review']==0) & (train_df['buy']==0) & (train_df['buy_date']==0)]
train_df = train_df.drop(search_df.index, axis=0)
search_df = test_df[(test_df['price']==0) & (test_df['review']==0) & (test_df['buy']==0) &(test_df['buy_date']==0)]
test_df = test_df.drop(search_df.index, axis=0)
x_train_df = train_df.drop(['id', 'rank'], axis=1)
x_test_df = test_df.drop(['id', 'rank'], axis=1)
y_train_df = train_df['rank']
y_test_df = test_df['rank']

print(x_train_df.head())

x_train = transformer.transform(x_train_df)
x_test = transformer.transform(x_test_df)

y_train = y_train_df.to_numpy()
y_test = y_test_df.to_numpy()

---------------------------여기서부터 오류 난 코드입니다------------------------------------

model = LinearRegression()
model.fit(x_train, y_train)

#모델 검증

print(model.score(x_test, y_test)) #0.5462414358589345
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-fb4f716a55ea> in <module>
      1 model = LinearRegression()
      2 
----> 3 model.fit(x_train, y_train)
      4 
      5 ##########모델 검증

C:\Anaconda3\envs\venv\lib\site-packages\sklearn\linear_model\base.py in fit(self, X, y, sample_weight)
    456         n_jobs_ = self.n_jobs
    457         X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'],
--> 458                          y_numeric=True, multi_output=True)
    459 
    460         if sample_weight is not None and np.atleast_1d(sample_weight).ndim > 1:

C:\Anaconda3\envs\venv\lib\site-packages\sklearn\utils\validation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
    754                     ensure_min_features=ensure_min_features,
    755                     warn_on_dtype=warn_on_dtype,
--> 756                     estimator=estimator)
    757     if multi_output:
    758         y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,

C:\Anaconda3\envs\venv\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    525             try:
    526                 warnings.simplefilter('error', ComplexWarning)
--> 527                 array = np.asarray(array, dtype=dtype, order=order)
    528             except ComplexWarning:
    529                 raise ValueError("Complex data not supported\n"

C:\Anaconda3\envs\venv\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
     83 
     84     """
---> 85     return array(a, dtype, copy=False, order=order)
     86 
     87 

ValueError: could not convert string to float: '[1]'
  • 에러가 발생하는 코드도 추가해 주시겠어요? nowp 2020.5.30 07:27
  • 추가했습니다! 최준호 2020.5.30 10:53

1 답변

  • linear regression 이라는 게, (x1, x2, x3, .., xn) n개의 수치에 대해, 수치값 y 를 예측하는 거잖아요. 근데, 현재 encoding name 컬럼이 단일한 수치가 아니기 때문에 에러가 발생하는 거구요.

    보통 이렇게 하는지는 잘 모르겠는데, 각 정수인코딩된 단어를 one hot 벡터로 변환하고, 그 one hot 벡터들을 더한 len(vocab) 길이의 벡터로 바꾸면 어찌됐든 linear regression 을 할 수는 있을 것 같아요.

    one hot vector란

    • 0 --> (1, 0, 0, 0, ..., 0)
    • 1 --> (0, 1, 0, 0, ... 0)

    식으로 변환하는 걸 말해요.

    그래서 여러 단어가 들어간 데이터는

    • [1] --> (0, 1, 0, ..., 0)
    • [1,2,3] --> (0, 1, 1, 1, ... , 0)

    이런 식이 되요.

    sklearn 에 아마 one hot vector 변환하는 함수 있을 거에요. 간단히 만들 수도 있고요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)