python - 为什么每次我在 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 个特征/列,数据应该保持不变,但由于某种原因,每次运行时准确度得分都会发生变化。
解决方案
你需要给random_state
in 一个值,train_test_split
否则每次你运行它而不指定random_state
时,你会得到不同的结果。发生的情况是,每次拆分数据时,您都会以不同的方式进行拆分,除非您指定随机状态或缺少随机状态。它相当于seed()
in R
。
推荐阅读
- protocol-buffers - Protobuf:我可以解析特殊的消息格式吗?
- html - 如何根据在另一个下拉字段中选择的值禁用日期选择器字段中的年份选择?
- jenkins - Jenkins 监听从端口不使用 IPV4
- java - 如何根据日期为 Anychart 折线图设置比例
- c - C 编程 Luhn 算法
- json - 如何用 jq 解析输入
- javascript - DOM XML:getElementsByTagName(...)[0] 未定义
- tensorflow - 从 tensorflow hub 加载 wiki40b 嵌入时出错
- java - Android:AsyncTask Object[] 不能在 doInBackground 中强制转换
- javascript - 如何从挂钩的 AJAX 请求中获取请求负载?