首页 > 技术文章 > libsvm与DataFrame的相互转换

marklong 2021-04-21 16:19 原文

参考链接:https://my.oschina.net/kyo4321/blog/1587881

将libsvm转为dataframe

from sklearn.datasets import load_svmlight_file
from pandas import DataFrame
import pandas as pd
X_train, y_train = load_svmlight_file("libsvm_data.txt")
mat = X_train.todense()

df1 = pd.DataFrame(mat)
df1.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']

df2 = pd.DataFrame(y_train)
df2.columns = ['target']

df = pd.concat([df2, df1], axis=1) ##第一列为target
df.to_csv("df_data.txt", index=False)

将dataframe转为libsvm

import pandas as pd
from sklearn.datasets import dump_svmlight_file
df = pd.read_csv("data.txt") ##第一个字段为target
y = df.target #y为数据的label值
dummy = pd.get_dummies(df.iloc[:, 1:])
mat = dummy.as_matrix()
dump_svmlight_file(mat, y, 'svm_output.libsvm', zero_based=False) ##默认为zero_based=True,转换后的字段编号从0开始

先进行独热,然后将数据转为libsvm

import pandas as pd
from sklearn.datasets import dump_svmlight_file
df = pd.read_excel("D:/data/test_info.xlsx")
df['target'] = df['status'].apply(lambda x: 1 if x=='Yes' else 0) ##{'Yes':1, 'No':0}
del df['status']

df.dtypes

df.loc[:,df.dtypes=='object']

df2 = df.iloc[:,1:-1] ##取第二列至倒数第二列
df_get_dummies = pd.get_dummies(df2.loc[:,df.dtypes=='object'])
df3 = pd.concat([df.target, df.score, df_get_dummies], axis=1)

"""
df3
Out[32]:
target score gender_female gender_male level_L level_M level_S
0 1 100 1 0 0 0 1
1 0 90 1 0 0 1 0
2 1 95 0 1 0 1 0
3 1 93 0 1 1 0 0
4 0 98 1 0 0 0 1
5 0 94 0 1 1 0 0
"""

接着转为libsvm

y = df3.target
dummy = pd.get_dummies(df3.iloc[:, 1:])
mat = dummy.as_matrix()
dump_svmlight_file(mat, y, 'test_output.libsvm', zero_based=False)

output of results ,字段为0的已压缩

"""
1 1:100 2:1 6:1
0 1:90 2:1 5:1
1 1:95 3:1 5:1
1 1:93 3:1 4:1
0 1:98 2:1 6:1
0 1:94 3:1 4:1
"""

test_info.xlsx

"""
name score gender level status
Alice 100 female S Yes
Bella 90 female M No
Cart 95 male M Yes
David 93 male L Yes
Ella 98 female S No
Fred 94 male L No
"""

get_dummies的利与弊

1、get_dummies 不像 sklearn 的 transformer一样,有 transform方法,所以一旦测试集中出现了训练集未曾出现过的特征取值,简单地对测试集、训练集都用 get_dummies 方法将导致数据错误。

2、不是 sklearn 里的transformer类型,所以得到的结果得手动输入到 sklearn 里的相应模块,也无法像 sklearn 的transformer一样可以输入到pipeline中 进行流程化地机器学习过程。

推荐阅读