将 float 转换为 int 不会丢失原始值的信息
Posted
技术标签:
【中文标题】将 float 转换为 int 不会丢失原始值的信息【英文标题】:Convert float to int not loosing information of original values 【发布时间】:2022-01-22 19:33:51 【问题描述】:我需要将 float 转换为 int。但是,我不想在转换时丢失任何信息。我考虑的值(来自在建模构建中使用 y 的数据框列)如下:
-1.0
0.0
9.0
-0.5
1.5
1.5
...
如果我直接将它们转换为 int,我可能会得到 -0.5 作为 0 或 -1,所以我会丢失一些信息。
我需要将上面的值转换为 int,因为我需要将它们传递给模型 model.fit(X, y)
。任何可以让我在 fit 函数中传递这些值的格式(上面的列是指 y 列)?
代码:
from sklearn.preprocessing import MinMaxScaler
le = preprocessing.LabelEncoder()
X = df[['Col1','Col2']].apply(le.fit_transform)
X_transformed=np.concatenate(((X[['Col1']]),(X[['Col2']])), axis=1)
y=df['Label'].values
scaler=MinMaxScaler()
X_scaled=scaler.fit_transform(X_transformed)
model_LS = LabelSpreading(kernel='knn',
gamma=70,
alpha=0.5,
max_iter=30,
tol=0.001,
n_jobs=-1,
)
LS=model_LS.fit(X_scaled, y)
数据:
Col1 Col2 Label
Cust1 Cust2 1.0
Cust1 Cust4 1.0
Cust4 Cust5 -1.5
Cust12 Cust6 9.0
我运行上述代码的错误是:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-174-14429cc07d75> in <module>
2
----> 3 LS=model_LS.fit(X_scaled, y)
~/opt/anaconda3/lib/python3.8/site-packages/sklearn/semi_supervised/_label_propagation.py in fit(self, X, y)
228 X, y = self._validate_data(X, y)
229 self.X_ = X
--> 230 check_classification_targets(y)
231
232 # actual graph construction (implementations should override this)
~/opt/anaconda3/lib/python3.8/site-packages/sklearn/utils/multiclass.py in check_classification_targets(y)
181 if y_type not in ['binary', 'multiclass', 'multiclass-multioutput',
182 'multilabel-indicator', 'multilabel-sequences']:
--> 183 raise ValueError("Unknown label type: %r" % y_type)
184
185
ValueError: Unknown label type: 'continuous'
【问题讨论】:
您不能将 0.5 转换为 int 而不会丢失一些信息,除非您之前将所有值乘以 10。模型适用于浮点数,这应该有效。此外,labelencoder 用于目标编码,而不是特征编码。 le.fit_transform(y)。如果标签是连续的,您应该使用回归模型。 您可以更改单位。例如,如果您只使用 1 个小数,则可以将所有*10
相乘,然后在最后需要小数时再次除以 /10
【参考方案1】:
您可以将值相乘以删除小数部分:
df = pd.DataFrame('Label': [1.0, -1.3, 0.75, 9.0, 7.8236])
decimals = df['Label'].astype(str).str.split('.').str[1].str.len().max()
df['y'] = df['Label'].mul(float(f"1edecimals")).astype(int)
print(df)
# Output:
Label y
0 1.0000 10000
1 -1.3000 -13000
2 0.7500 7500
3 9.0000 90000
4 7.8236 78236
【讨论】:
【参考方案2】:我认为你需要:
from sklearn.preprocessing import LabelEncoder
df = pd.DataFrame(data='y':[-1.0, 0.0 , 9.0, -0.5, 1.5 , 1.5])
le = LabelEncoder()
le.fit(df['y'])
df['y'] = le.transform(df['y'])
print(df)
OUTPUT
y
0 0
1 2
2 4
3 1
4 3
5 3
【讨论】:
快速提问:df
将是包含原始Label
列的数据集,对吧?我的意思是df['y']
是df['Label']
没错……以上是关于将 float 转换为 int 不会丢失原始值的信息的主要内容,如果未能解决你的问题,请参考以下文章
传输原始数据,例如 int、float-tuple:解析字符串或转换为字节数组更有效?