Pandas + scikit-learn K-means无法正常工作 - 将所有数据帧行视为一个大的多维示例

Mak*_*ich 5 python pandas scikit-learn

我目前正在尝试使用存储在我的pandas.dataframe中的数据进行一些k-means聚类(实际上是在其中一个列中).奇怪的是,不是将每一行视为一个单独的例子,它威胁所有行作为一个例子但是在非常高的维度.例如:

df = pd.read_csv('D:\\Apps\\DataSciense\\Kaggle Challenges\\Titanic\\Source Data\\train.csv', header = 0)

median_ages = np.zeros((2,3))

for i in range(0,2):
    for j in range (0,3):
        median_ages[i, j] =df[(df.Gender == i) &(df.Pclass == j+1)].Age.dropna().median()

df['AgeFill'] = df['Age']

for i in range(0, 2):
    for j in range(0,3):
        df.loc[ (df.Age.isnull()) & (df.Gender == i) & (df.Pclass == j+1), 'AgeFill'] = median_ages[i, j]
Run Code Online (Sandbox Code Playgroud)

然后我只是检查它看起来很好:

df.AgeFill

Name: AgeFill, Length: 891, dtype: float64
Run Code Online (Sandbox Code Playgroud)

看起来不错,891 float64号.我做骂人:

k_means = cluster.KMeans(n_clusters=1, init='random')
k_means.fit(df.AgeFill)
Run Code Online (Sandbox Code Playgroud)

我检查集群中心:

k_means.cluster_centers_
Run Code Online (Sandbox Code Playgroud)

它给我一个巨大的阵列.

此外:

k_means.labels_
Run Code Online (Sandbox Code Playgroud)

给我:

array([0])
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?为什么它认为我有一个891维度的例子,而不是891例子?

只是为了更好地说明,如果我尝试2个集群:

k_means = cluster.KMeans(n_clusters=2, init='random')
k_means.fit(df.AgeFill)
Run Code Online (Sandbox Code Playgroud)

回溯(最近一次调用最后一次):文件"",第1行,在k_means.fit(df.AgeFill)文件"D:\ Apps\Python\lib\site-packages\sklearn\cluster\k_means_.py",第724行,in fit X = self._check_fit_data(X)文件"D:\ Apps\Python\lib\site-packages\sklearn\cluster\k_means_.py",第693行,_check_fit_data X.shape [0],self.n_clusters ))ValueError:n_samples = 1应该> = n_clusters = 2

所以你可以看到它真的认为它只是一个巨大的样本.

但:

df.AgeFill.shape
(891,)
Run Code Online (Sandbox Code Playgroud)

ely*_*ase 9

您正在传递一维数组,而scikit需要一个带有样本特征轴的二维数组.这应该这样做:

k_means.fit(df.AgeFill.reshape(-1, 1))
Run Code Online (Sandbox Code Playgroud)

之前:

>>> df.AgeFill.shape
(891,)
Run Code Online (Sandbox Code Playgroud)

后:

>>> df.AgeFill.reshape(-1, 1).shape
(891, 1)
Run Code Online (Sandbox Code Playgroud)