我正在使用sklearn和聚集聚类功能。我有一个混合数据,其中包括数字和标称数据列。我的名义列的值包括“早晨”,“下午”,“晚上”,“夜晚”。如果我通过分配整数值(例如0、1、2、3)将标称数据转换为数值,欧氏距离将被计算为“夜”和“早晨”之间的3,但应以1作为返回值作为距离。
X = pd.read_csv("mydata.csv", sep=",", header=0, encoding="utf-8")
X = StandardScaler().fit_transform(X)
print("n_samples: %d, n_features: %d" % X.shape)
km = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='average')
km.fit(X)
print("k = %d, Silhouette Coefficient: %0.3f" % (x,
metrics.silhouette_score(X, km.labels_, sample_size=None)))
这是我的代码。
如何在sklearn中自定义距离功能或将标称数据转换为数字?
答案 0 :(得分:1)
我认为您有3种方法将分类特征转换为数字:
代码:
def two_hot(x):
return np.concatenate([
(x == "morning") | (x == "afternoon"),
(x == "afternoon") | (x == "evening"),
(x == "evening") | (x == "night"),
(x == "night") | (x == "morning"),
], axis=1).astype(int)
x = np.array([["morning", "afternoon", "evening", "night"]]).T
print(x)
x = two_hot(x)
print(x)
输出:
[['morning']
['afternoon']
['evening']
['night']]
[[1 0 0 1]
[1 1 0 0]
[0 1 1 0]
[0 0 1 1]]
然后我们可以测量距离:
from sklearn.metrics.pairwise import euclidean_distances
euclidean_distances(x)
输出:
array([[0. , 1.41421356, 2. , 1.41421356],
[1.41421356, 0. , 1.41421356, 2. ],
[2. , 1.41421356, 0. , 1.41421356],
[1.41421356, 2. , 1.41421356, 0. ]])
答案 1 :(得分:0)
此问题在机器学习应用程序中很常见。您需要将一个类别定义为基本类别(无关紧要),然后为其他每个类别定义指标变量(0或1)。换句话说,创建3个新变量,分别称为“早晨”,“下午”和“晚上”,然后为每个观测值具有的类别分配一个变量。如果是夜间观察,则将每个新变量保留为0。