首页 > 解决方案 > 为什么每次我在 python 中运行代码时我的 PCA 都会发生变化?

问题描述

我用每个特征的中位数估算了任何缺失值的数据框,并使用 StandardScaler() 进行了缩放。我运行 n=3 的常规 kneighbors 并且准确性保持一致。

现在我要使用 n_components=4 对结果数据集进行 PCA,并应用具有 3 个邻居的 K-neighbors。但是,每次我运行我的代码时,每次我运行程序时,PCA 数据集和 kneighbors 精度都会发生变化,但主数据集本身不会发生变化。我什至尝试在应用 kneighbors 时使用数据集的前 4 个特征,但结果还是不一致。

data = pd.read_csv('dataset.csv')
y = merged['Life expectancy at birth (years)']

X_train, X_test, y_train, y_test = train_test_split(data,
                                                    y,
                                                    train_size=0.7, 
                                                    test_size=0.3, 
                                                    random_state=200)
  
for i in range(len(features)):
    featuredata = X_train.iloc[:,i]
    fulldata = data.iloc[:,i]
    
    fulldata.fillna(featuredata.median(), inplace=True)
    
    data.iloc[:,i] = fulldata


scaler = preprocessing.StandardScaler().fit(X_train)
data = scaler.transform(data)

如果我在这里应用 KNeighbors,它运行良好,并且我的准确度得分保持不变。

pcatest = PCA(n_components=4)

pca_data = pcatest.fit_transform(data)

X_train, X_test, y_train, y_test = train_test_split(pca_data,
                                                    y,
                                                    train_size=0.7, 
                                                    test_size=0.3)

pca = neighbors.KNeighborsClassifier(n_neighbors=3)
pca.fit(X_train, y_train)
y_pred_pca = pca.predict(X_test)
pca_accuracy = accuracy_score(y_test, y_pred_pca)

但是,每次运行代码时,我的 pca_accuracy 分数都会发生变化。我能做些什么来使它设置和一致?

first4_data = data[:,:4]

X_train, X_test, y_train, y_test = train_test_split(first4_data,
                                                    y,
                                                    train_size=0.7, 
                                                    test_size=0.3)

first4 = neighbors.KNeighborsClassifier(n_neighbors=3)
first4.fit(X_train, y_train)
y_pred_first4 = first4.predict(X_test)
first4_accuracy = accuracy_score(y_test, y_pred_first4)

我只采用前 4 个特征/列,数据应该保持不变,但由于某种原因,每次运行时准确度得分都会发生变化。

标签: pythonpandaspcaknn

解决方案


你需要给random_statein 一个值,train_test_split否则每次你运行它而不指定random_state时,你会得到不同的结果。发生的情况是,每次拆分数据时,您都会以不同的方式进行拆分,除非您指定随机状态或缺少随机状态。它相当于seed()in R


推荐阅读