为什么每次在python中运行代码时PCA都会更改?

问题描述

我用每个要素的中值估算数据框的所有缺失值,并使用StandardScaler()进行缩放。我跑了n = 3的常规邻居,准确性保持一致。

现在,我要使用n_components = 4进行结果数据集的PCA并应用具有3个邻居的K邻居。但是,每次我运行代码时,每次我运行该程序时,PCA数据集和邻居的准确性都会发生变化,但是主数据集本身不会发生变化。我什至试过在应用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,y_test = train_test_split(pca_data,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,y_test = train_test_split(first4_data,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个要素/列,数据应该保持不变,但是由于某些原因,每次运行时准确性得分都会发生变化。

解决方法

您需要在random_state中为train_test_split赋予一个值,否则每次运行它而未指定random_state时,您将得到不同的结果。发生的情况是,每次拆分数据时,您都将以不同的方式进行处理,除非您指定了随机状态,否则就没有该状态。相当于seed()中的R