2017-05-11 14 views
2

まず、私はすべての関連する質問を見ました。 非常に似た問題があります。
私はリンクからの提案に従ったが、どれも私のために働いていなかった。
Data Conversion Error while applying a function to each row in pandas Python
Getting deprecation warning in Sklearn over 1d array, despite not having a 1D arraysklearn:sklearn.preprocessing配列の非推奨警告

私はまた、それもうまくいきませんでした、エラーメッセージに従うことを試みました。

コードは次のようになります。

# Importing the libraries 
import numpy as np 
import pandas as pd 

# Importing the dataset 
dataset = pd.read_csv('Position_Salaries.csv') 
X = dataset.iloc[:, 1:2].values 
y = dataset.iloc[:, 2].values 

# avoid DataConversionError 
X = X.astype(float) 
y = y.astype(float) 


## Attempt to avoid DeprecationWarning for sklearn.preprocessing 
#X = X.reshape(-1,1)     # attempt 1 
#X = np.array(X).reshape((len(X), 1)) # attempt 2 
#X = np.array([X])     # attempt 3 


# Feature Scaling 
from sklearn.preprocessing import StandardScaler 
sc_X = StandardScaler() 
sc_y = StandardScaler() 
X = sc_X.fit_transform(X) 
y = sc_y.fit_transform(y) 

# Fitting SVR to the dataset 
from sklearn.svm import SVR 
regressor = SVR(kernel = 'rbf') 
regressor.fit(X, y) 

# Predicting a new result 
y_pred = regressor.predict(sc_X.transform(np.array([6.5]))) 
y_pred = sc_y.inverse_transform(y_pred) 

データは次のようになります。

Position,Level,Salary 
Business Analyst,1,45000 
Junior Consultant,2,50000 
Senior Consultant,3,60000 
Manager,4,80000 
Country Manager,5,110000 
Region Manager,6,150000 
Partner,7,200000 
Senior Partner,8,300000 
C-level,9,500000 
CEO,10,1000000 

完全なエラー・ログはこのように書き:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/preprocessing/data.py:586: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. 
    warnings.warn(DEPRECATION_MSG_1D, DeprecationWarning) 
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/preprocessing/data.py:649: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. 
    warnings.warn(DEPRECATION_MSG_1D, DeprecationWarning) 
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/preprocessing/data.py:649: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. 
    warnings.warn(DEPRECATION_MSG_1D, DeprecationWarning) 
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/utils/validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. 
    DeprecationWarning) 

私は唯一の二使用しています第3の列であり、第1の列に対して1つのホットエンコーディングの必要はない。唯一の問題はDeprecationWarningです。

私はすべての提案を試みましたが、どれも働いていませんでした。
だから、本当に助けになるでしょう。

+1

スタックトレースを含む完全なエラーメッセージを投稿できますか? –

+0

私はこれをまっすぐにしましょう:X(データフレームのレベルの列)に単一の機能がありますか? –

+0

@VivekKumar質問にデータを掲載しました。 –

答えて

3

これは奇妙なものでした。非推奨の警告を取り除くために私が使用したコードは、StandardScaler()にどのように適合し、transform()と呼ばれるかを若干修正したものです。この解決策は、警告メッセージに従ってアレイを慎重に再形成し、ラベリングすることが必要でした。これが最善の方法であるかどうかはわかりませんが、警告を削除しました。

# Importing the libraries 
import numpy as np 
import pandas as pd 
from io import StringIO 
from sklearn.preprocessing import StandardScaler 

# Setting up data string to be read in as a .csv 
data = StringIO("""Position,Level,Salary 
Business Analyst,1,45000 
Junior Consultant,2,50000 
Senior Consultant,3,60000 
Manager,4,80000 
Country Manager,5,110000 
Region Manager,6,150000 
Partner,7,200000 
Senior Partner,8,300000 
C-level,9,500000 
CEO,10,1000000""") 

dataset = pd.read_csv(data) 

# Importing the dataset 
#dataset = pd.read_csv('Position_Salaries.csv') 

# Deprecation warnings call for reshaping of single feature arrays with reshape(-1,1) 
X = dataset.iloc[:, 1:2].values.reshape(-1,1) 
y = dataset.iloc[:, 2].values.reshape(-1,1) 

# avoid DataConversionError 
X = X.astype(float) 
y = y.astype(float) 

#sc_X = StandardScaler() 
#sc_y = StandardScaler() 
X_scaler = StandardScaler().fit(X) 
y_scaler = StandardScaler().fit(y) 

X_scaled = X_scaler.transform(X) 
y_scaled = y_scaler.transform(y) 

# Fitting SVR to the dataset 
from sklearn.svm import SVR 
regressor = SVR(kernel = 'rbf') 

# One of the warnings called for ravel() 
regressor.fit(X_scaled, y_scaled.ravel()) 

# Predicting a new result 
# The warnings called for single samples to reshaped with reshape(1,-1) 
X_new = np.array([6.5]).reshape(1,-1) 
X_new_scaled = X_scaler.transform(X_new) 
y_pred = regressor.predict(X_new_scaled) 
y_pred = y_scaler.inverse_transform(y_pred) 
+3

これが最善の方法です。なぜ警告が存在するのかを知るには、[この質問]を見ることができます(https://stackoverflow.com/questions/41972375/why-does-scikit-learn-demand-different-data-shapes-for-different-regressors/ 42063867#42063867) –

+0

ありがとう、私はこれらの操作を必要とする背後の哲学への言及にかなり感謝します。 –

+3

1次元アレイの場合、以前のscikit-learnは、Xとyの両方に基づいて自動的に推論するために使用されていました。しかし、Xだけが供給される場合(StandardScaler)、供給される配列がn個のフィーチャを持つサンプルであるか、それぞれn個のフィーチャが単一のフィーチャを持つサンプルであるかは、どのように推測するのが問題か。それはまだ処理しますが、次のバージョンが自動的にそれを推測してエラーを出すので、明示的に変換することを警告します。 –

関連する問題