AI-Driven Early Detection of Breast Cancer
Erin D'Souza
Grade 9
Presentation
Problem
Problem
Breast cancer is the most common cancer among women globally and a leading cause of cancer-related deaths. 1 in 3 diagnosed female cancer cases are breast cancer. There has also been a noticeable increase in breast cancer incidence, following a trend of a 1% increase every year. These climbing rates have made early detection more important than ever, as when localized tumors are detected as early as possible (Stage 0).
The 5-year survival rate for women aged 50 and older with Stage 2-3 breast cancer is 85%, with stage 4 being 26%. This is a stark contrast to the 5-year survival rates of stages 0-2, which is a 99% chance of survival. Early-stage cancers allow less aggressive treatments like lumpectomies instead of systemic chemotherapy.
Mammograms are the most common method of detection currently used, but they have various limitations and disadvantages. 11-12% of mammograms produce false positive results from a single screening, with 50% of women who receive annual mammograms having a false positive over a decade. There is also a problematic 13-20% chance cancer is missed after the first screening, frequently causing late detection. Annual mammograms are also controversial due to the treatment of over-diagnosed cancers and the long-term effects of accumulated radiation doses. Ultrasounds are another common method, but like mammograms, they often produce inaccurate results.
Objective
This project aims to use multi-method feature selection, a high accuracy Support Vector Machine and Random Forest classification for differential analysis of microRNA expression data for early detection of breast cancer (stage 0 and 1).
Method
Biological Background
miRNA are small, non-coding RNA molecules that are usually around 20-23 nucleotides in length. They are single-stranded and play a crucial role in post-transcriptional regulation of gene expression. When matured, they are incorporated into the RNA-induced silencing complex.
miRNA can function as both oncogenes (oncomir) and tumor suppressors, and dysregulated miRNA is observed in all human cancers affecting both initiation and progression. Oncogenic miRNA down-regulate suppressors, causing the reduction of programmed cell death and ultimately uncontrolled cell growth. miRNA can be non-invasively measured from biological fluids such as plasma and serum, improving clinical feasibility. Additionally, changes in miRNA levels have also been noted following successful treatment, highlighting the effectiveness of monitoring disease progression.
However, because single miRNAs can have multiple functions or a complex relationship with the regulation of the target disease, multiple miRNAs are often required to be analyzed for accurate results. Datasets often feature thousands of miRNAs, but due to the recency of miRNA discovery and sequencing technologies, very few samples are available for public use. The result of this very high-dimensionality data, with thousands of features and hundreds of samples.
Data Structure
This section shows how data is organized for analyzing miRNA expression in breast cancer detection.
Total no. of Samples is 1,162 samples
Break down of
- Tumor Samples: 1,060
- Normal Samples: 102
The expression matrix shape is (1162, 15), which equals to
- 1,162 total samples (rows)
- 15 miRNA features/miRNAs (columns)
After filtering it to Stage 0 and 1 - we have 84 early cancer vs 102 Normal samples
High Dimensionality of miRNA DATA
miRNA data are considered high dimensional due to the large number of miRNAs where each miRNA are is quantified by sequencing reads. Therefore a typical small miRNA dataset creates more features than samples. This high feature-to-sample ratio poses analytical challenges and the non linear relationship of miRNAs adds to the complexity
ML/ AI and miRNA
Machine learning significantly enhances differential expression analysis of miRNA by enabling the identification of complex patterns and subtle changes in high-dimensional data that traditional methods might miss. ML algorithms improve accuracy and sensitivity, aiding in disease diagnosis. These capabilities make ML an indispensable tool for extracting meaningful insights from miRNA expression data,
Data Sources and Structure:
TheRaw miRNA Data is located at /mirna_data/ and the individual files are formatted as .mirna.txt files. The data is categorized as Tumor samples and Normal samples
Clinical data contains - Patient metadat, staging information. It is in .tsv format. Key fields are -Age, gender, tumor stage and so on…
1. Processing Pipeline:
a. Preprocessing Stage (2_preprocessing/)
- Expression Matrix Creation
- Sample Type Verification
- Early-Stage Filtering
b. Normalization Stage (3_normalization/)
- TMM (Trimmed Mean of M-values) normalization
- Between-sample normalization
- Batch effect correction
c. Feature Selection Stage (Feature_selection/)
- Basic Filtering
- Statistical Tests
- ML-based Selection
- Stability Analysis
2. Sample Completeness Checks. This make sure that the data is complete and data quality is good.
# Checks number of miRNAs per sample # Verifies no missing values samples_above_threshold = (expr_matrix >= min_count).sum(axis=0) / expr_matrix.shape[0] missing_values = expr_matrix.isnull().sum()
3. Expression Thresholds: Filters out the noise from the data
# Minimum read count threshold
min_count = 10
# Minimum detection rate across samples
min_detection_rate = 0.3
# Variance threshold for feature selection
variance_percentile = 75
Quality Control Metrics: This makes sure data is reliable and consistent
The metrics tracked here are :
- Read depth per sample: This checks if each of the same has the depth or enough data or “reads” for reliable analysis
- Expression distribution analysis: Make sure mirna expression levels follow expected patterns
- Technical replicate correlation: when algorithms are repeated the data needs to give same results. This feature tracks that metric.
- Sample-to-sample correlation: This checks for correlation or similarity between the data
- Outlier detection
4. Read Depth Quality Control:
def check_read_depth(expr_matrix): """Analyze read depth per sample""" # Calculate total reads per sample reads_per_sample = expr_matrix.sum(axis=1) # Define thresholds min_reads = 1000000 # Minimum acceptable reads # Flag low-depth samples low_depth_samples = reads_per_sample < min_reads return { 'total_samples': len(reads_per_sample), 'low_depth_samples': sum(low_depth_samples), 'median_depth': np.median(reads_per_sample), 'depth_distribution': reads_per_sample.describe() }
5. Expression Distribution Analysis:
def analyze_expression_distribution(expr_matrix): """Check expression value distributions""" # Calculate basic statistics stats = { 'mean_expression': expr_matrix.mean().mean(), 'std_expression': expr_matrix.std().mean(), 'zero_rate': (expr_matrix == 0).sum().sum() / expr_matrix.size, 'quantiles': expr_matrix.quantile([0.25, 0.5, 0.75]).mean() } return stats
- Sample Correlation Analysis:
def check_sample_correlations(expr_matrix): """Analyze correlations between samples""" # Calculate correlation matrix corr_matrix = expr_matrix.corr() # Identify potential outliers (samples with low correlation) mean_corr = corr_matrix.mean() outliers = mean_corr[mean_corr < 0.7].index.tolist() return { 'median_correlation': corr_matrix.median().median(), 'potential_outliers': outliers, 'correlation_stats': mean_corr.describe() }
- Technical Replicate Validation:
def validate_technical_replicates(expr_matrix, replicate_groups):
"""Check consistency between technical replicates"""
replicate_cors = []
for group in replicate_groups:
# Calculate correlation between replicates
group_data = expr_matrix.loc[group]
group_cor = group_data.corr().mean().mean()
replicate_cors.append(group_cor)
return {
'mean_replicate_correlation': np.mean(replicate_cors),
'min_replicate_correlation': np.min(replicate_cors),
'failed_replicates': sum(np.array(replicate_cors) < 0.95)
}
def validate_technical_replicates(expr_matrix, replicate_groups): """Check consistency between technical replicates""" replicate_cors = [] for group in replicate_groups: # Calculate correlation between replicates group_data = expr_matrix.loc[group] group_cor = group_data.corr().mean().mean() replicate_cors.append(group_cor) return { 'mean_replicate_correlation': np.mean(replicate_cors), 'min_replicate_correlation': np.min(replicate_cors), 'failed_replicates': sum(np.array(replicate_cors) < 0.95) }
-
Batch Effect Assessment: This identifies and corrects systematic variaitons within the datat
The methods used here are:
- Principal Component Analysis (PCA) - This simplifies complex data by finding patterns
- Batch effect visualization - Measures the difference in batches due to the experiment conducted and not biological related.
- ComBat normalization for batch correction - This removes variation between batches so they can be compared
- Technical variation assessment - This measures variation in data due to technical reasons and not biological
Output Data Format for this model are as follows:
- Normalized Expression Matrix in .parquet format
- Sample Metadata is in .csv format
- QC Reports in .html format and
- Validation Logs in .txt
Normalization
Normalization is an essential process of organizing data to reduce redundancy and data anomalies while preserving data integrity. There are various methods of normalization, including Min-Max Scaling, which is useful when data needs to be bound, standardization for algorithms that assume normal distribution, and robust scaling to remove outliers.
However, because none of the mentioned methods are best suitable for differential analysis of expression data due to the unique distribution of RNA-seq data, I decided to utilize TMM normalization (Trimmed Mean of M-Values).
TMM aims to address the issue of composition biases in RNA-seq data. For each gene, TMM calculates the m-value, or the log2 ratio between gene counts. In addition to this, TMM also calculates the A-value or the average log2 count for each gene. After identifying these values, extreme m-values and a-values are trimmed from both ends of the distribution. To reduce these outliers, two key trimming parameters are set, usually 30% for the m-value and 5% for the a-value.
Feature Selection
Feature selection streamlines data analysis by isolating the most informative variables, boosting model performance and accuracy while discarding redundant or irrelevant data. In the context of miRNA expression analysis it filters out irrelevant noise. It's a process that pinpoints the most important miRNAs that clearly differentiate between healthy and cancerous tissues, simplifying the analysis and improving accuracy.
MAIN COMPONENTS OF FEATURE SELECTION
( citation book - "Computational Methods of Feature Selection" by Huan Liu and Hiroshi Motoda)
The pipeline, implemented in the FeatureSelection combines basic filtering, statistical filtering, machine learning-based selection, and stability analysis
- Expression Filtering: implements preliminary filtering to remove low-confidence measurements prior to applying more sophisticated selection methods.
Low Count Filtering (Sub-Component): This filter eliminates miRNAs with insufficient read counts, which represent transcripts at or below the technical detection limit. In miRNA Analysis
miRNA sequencing technologies produce numerous low-count data points. Robust biomarkers must demonstrate consistent expression above technical noise thresholds to ensure reproducibility and clinical validity.
Implementation Logic
def filter_low_counts(expr_matrix, min_count=10, min_samples_fraction=0.9):
"""Filter out miRNAs with consistently low counts"""
samples_above_threshold = (expr_matrix >= min_count).sum(axis=0) / expr_matrix.shape[0]
keep_mirnas = samples_above_threshold >= min_samples_fraction
filtered_matrix = expr_matrix.loc[:, keep_mirnas]
return filtered_matrix
Parameters
- min_count=10: Minimum read count threshold for reliable detection
- Values <5: Insufficient for distinguishing true expression from background noise. Values >15 is Excessively stringent for low-abundance miRNAs that may have biological significance. 10 represents an empirically validated threshold in RNA-seq methodologies that balances sensitivity with specificity
- min_samples_fraction=0.9: Proportion of samples in which the expression must exceed the threshold
- Values <0.8: Would retain miRNAs with inconsistent technical detection. Values >0.95: would Overly restrictive, potentially eliminating disease-specific markers. 0.9 ensures high confidence in detection reliability while accommodating some sample heterogeneity
1.2 Detection Rate Filtering (Sub-Component); this filter focuses on the prevalence of miRNA detection across the sample cohort, eliminating those with sparse representation. miRNAs detected in very few samples are sample-specific anomalies rather than consistent biological signals.
Implementation Logic
def filter_by_detection(expr_matrix, min_rate=0.3):
"""Keep miRNAs detected in sufficient samples"""
detection_rate = (expr_matrix > 0).sum(axis=0) / expr_matrix.shape[0]
keep_mirnas = detection_rate >= min_rate
filtered_matrix = expr_matrix.loc[:, keep_mirnas]
return filtered_matrix
Parameter
- min_rate=0.3: Minimum fraction of samples in which the miRNA must be detected
- Values <0.2: Would retain extremely sparse features unlikely to have cohort-wide relevance. Values >0.5: Might eliminate cancer subtype-specific markers that appear only in certain samples. 0.3 offers an optimal threshold that retainsrelevant signals while excluding false detections
1.3 Variance Filtering Sub-Component: This filter retains miRNAs with sufficient expression variability across samples, eliminating those with uniform expression patterns. miRNAs with minimal expression variation provide limited discriminative power for classification purposes, even if consistently detected.
Implementation Logic
def filter_by_variance(expr_matrix, percentile=75):
"""Select highly variable miRNAs"""
variances = expr_matrix.var()
var_threshold = np.percentile(variances, percentile)
keep_mirnas = variances >= var_threshold
filtered_matrix = expr_matrix.loc[:, keep_mirnas]
return filtered_matrix
def filter_by_chisquare(expr_matrix, y, significance_level=0.2):
"""Select features using chi-square test with enhanced binning"""
results = pd.DataFrame(index=expr_matrix.columns)
for mirna in expr_matrix.columns:
# Extract tumor and normal expression values
tumor_expr = expr_matrix.loc[y == 1, mirna]
normal_expr = expr_matrix.loc[y == 0, mirna]
# Create bins for contingency table analysis
combined_expr = pd.concat([tumor_expr, normal_expr])
bins, success = create_bins(combined_expr)
# Create contingency table and perform chi-square test
contingency = pd.crosstab(bins, y[bins.index])
chi2, p_value = stats.chi2_contingency(contingency)[:2]
results.loc[mirna, ['chi2_statistic', 'p_value']] = [chi2, p_value]
Parameter
- significance_level=0.2: FDR-corrected p-value threshold
- Values <0.05: Excessively stringent for biomarker discovery, risking false negativesValues >0.3: Permissive threshold risking false positive inclusion. Rrepresents a moderate stringency appropriate for exploratory biomarker research
2.2 Binning Strategy Sub-Component This sub-component transforms continuous miRNA expression values into categorical bins for statistical testing. Appropriate binning strategies are crucial for capturing non-linear relationships in miRNA expression data and enabling contingency table analyses.
Implementation Logic
Parameter
- percentile=75: Percentile threshold for variance-based selection
- Values <50: Would retain too many uninformative features with limited variability.Values >90: Overly restrictive, potentially eliminating relevant markers.75 represents a balanced threshold that retains the top quartile of miRNAs by variance, an established practice in gene expression studies
2. Statistical Feature Selection: This component applies rigorous statistical testing frameworks to identify miRNAs with significant expression differences between clinical groups.
2**.1 Chi-Square Test Sub-Component:** This statistical test evaluates whether expression distributions differ significantly between sample groups through contingency table analysis.
Chi-square testing offers a non-parametric approach suitable for miRNA data that may not follow normal distributions, providing robust detection of differential expression patterns.
Implementation Logic
def create_bins(data):
"""Enhanced create_bins function with multiple strategies and validation"""
try:
# Run sensitivity analysis
sensitivity_results = analyze_binning_sensitivity(data)
# Select optimal strategy based on metrics
best_strategy = None
best_n_bins = None
best_score = -float('inf')
for strategy in sensitivity_results:
for n_bins, metrics in sensitivity_results[strategy].items():
# Combined score based on variance preservation and bin balance
score = (metrics['variance_ratio'] + metrics['bin_balance']) / 2
if score > best_score:
best_score = score
best_strategy = strategy
best_n_bins = n_bins
# Apply optimal binning
discretizer = KBinsDiscretizer(
n_bins=best_n_bins,
encode='ordinal',
strategy=best_strategy
)
data_array = data.values if hasattr(data, 'values') else np.array(data)
binned_data = discretizer.fit_transform(data_array.reshape(-1, 1))
return pd.Series(binned_data.flatten(), index=data.index), True
except:
return None, False
Parameter
- Binning strategies: ['quantile', 'uniform', 'kmeans']
- Quantile: Creates equal-sized bins, optimal for skewed distributions common in miRNA data. Uniform: Creates equal-width bins, suitable for normally distributed features. KMeans: Creates clusters based on data density, adapts to multimodal distributions
- n_bins_range=[3, 5, 7, 10]: Potential number of bins to evaluate
- Values <3 means Insufficient granularity for capturing expression patterns. Values >10: Excessive granularity leading to sparse contingency tables. Range of 3-10 bins provides flexibility to adapt to different expression distributions
2.3 Multiple Testing Correction Sub-Component: This sub-component applies statistical adjustments to account for inflated false positive rates when testing multiple hypotheses simultaneously. When testing hundreds or thousands of miRNAs, conventional significance thresholds lead to numerous false positives. Multiple testing correction methods control this error rate.
Implementation Logic
# Add multiple testing correction
valid_pvals = results['p_value'].notna()
results.loc[valid_pvals, 'adjusted_p_value'] = multipletests(
results.loc[valid_pvals, 'p_value'], alpha=significance_level, method='fdr_bh'
)[1]
significant_features = results[results['adjusted_p_value'] < significance_level].index
Parameter
- method='fdr_bh': Benjamini-Hochberg False Discovery Rate control
- More powerful than family-wise error rate methods (e.g., Bonferroni). Controls the proportion of false positives among rejected hypotheses. Standard approach in high-dimensional genomic analyses
3. Machine Learning-Based: This component leverages supervised learning algorithms to identify miRNAs with optimal predictive capacity for phenotype classification.
3.1 Support Vector Machine (SVM): This sub-component employs linear SVM models to identify miRNAs with strong discriminative power through coefficient analysis. Importance in miRNA Analysis. SVM excels at finding the optimal hyperplane separating cancer from normal samples, with coefficients reflecting each miRNA's contribution to classification.
Implementation Logic
def optimize_svm(X, y):
"""Optimize SVM with nested CV and improved convergence"""
param_grid = {
'C': [0.1, 1, 10],
'class_weight': ['balanced'],
'max_iter': [10000]
}
svm = LinearSVC(random_state=42)
grid_search = GridSearchCV(
svm, param_grid,
cv=StratifiedKFold(n_splits=5, shuffle=True, random_state=42),
scoring='balanced_accuracy',
n_jobs=-1
)
grid_search.fit(X, y)
# Train final model with optimal parameters
final_svm = LinearSVC(**grid_search.best_params_, random_state=42)
final_svm.fit(X, y)
return final_svm, grid_search.best_score_
Parameter Analysis
- C=[0.1, 1, 10]: Regularization parameter search range
- C=0.1: Strong regularization, simpler model, potential underfitting. C=1.0: Moderate regularization, balanced complexity. C=10: Weak regularization, more complex model, potential overfitting. Grid search across this range identifies optimal complexity for the dataset
- class_weight='balanced': Class weighting strategy
- Essential for miRNA cancer data with imbalanced normal/tumor sample counts. This Adjusts misclassification penalties inversely proportional too class frequencies
- max_iter=10000: Maximum iterations for convergence
- Higher than default to ensure proper convergence on complex miRNA patterns. Values <5000 might lead to premature termination and suboptimal solutions
3.2 Random Forest : This ensemble learning approach builds multiple decision trees and measures feature importance through their collective voting patterns. Random Forest captures non-linear relationships and miRNA interactions that may be missed by linear methods, offering complementary perspectives on feature importance.
Implementation Logic
def optimize_random_forest(X, y):
"""Optimize Random Forest with nested CV and drift monitoring"""
param_grid = {
'n_estimators': [200, 300, 500],
'max_depth': [10, 20, 30],
'min_samples_split': [5],
'class_weight': ['balanced']
}
rf = RandomForestClassifier(random_state=42)
grid_search = GridSearchCV(
rf, param_grid,
cv=StratifiedKFold(n_splits=5, shuffle=True, random_state=42),
scoring='balanced_accuracy',
n_jobs=-1
)
grid_search.fit(X, y)
# Train final model with optimal parameters
final_rf = RandomForestClassifier(**grid_search.best_params_, random_state=42)
final_rf.fit(X, y)
return final_rf, grid_search.best_score_
Parameter
- n_estimators=[200, 300, 500]: Number of decision trees in the ensemble
- Values <100: Insufficient for stable feature importance estimates in high-dimensional data. Values >500: Diminishing returns with increased computational demands. Range of 200-500 trees provides robust ensemble performance while maintaining efficiency
- max_depth=[10, 20, 30]: Maximum depth of individual trees
- Values <10: May underfit complex miRNA expression patterns. Values >30: Risk of overfitting to training data. 10-30 range offers appropriate complexity capacity for biomarker discovery
- min_samples_split=5: Minimum samples required to split an internal node
- Lower values increase tree complexity and potential overfitting. 5 samples represents a moderate constraint that prevents splitting on too few examples.
3.3 Ensemble Importance Integration: This sub-component synthesizes feature importance metrics from multiple algorithms into a unified ranking. Integration of complementary importance metrics from different algorithms enhances robustness by capturing both linear and non-linear expression patterns.
Implementation Logic
def select_features_combined(X, y, percentile=10):
# Scale features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Optimize models
svm, svm_scores = optimize_svm(X_scaled, y)
rf, rf_scores = optimize_random_forest(X_scaled, y)
# Get feature importance
svm_coef = np.abs(svm.coef_[0])
rf_importance = rf.feature_importances_
# Ensure no NaN values
svm_coef = np.nan_to_num(svm_coef)
rf_importance = np.nan_to_num(rf_importance)
# Combine importance scores (normalized)
combined_importance = (svm_coef / np.max(svm_coef) +
rf_importance / np.max(rf_importance)) / 2
# Select top features
n_features = int(X.shape[1] * percentile/100)
n_features = max(1, min(n_features, X.shape[1]))
top_indices = np.argsort(combined_importance)[-n_features:]
selected_features = X.columns[top_indices]
return X[selected_features], selected_features
Parameter Analysis
- percentile=10: Percentage of top-ranked features to select
- Values <5: Excessively restrictive, may miss important patterns. Values >20: Insufficiently selective, retains features with marginal contribution. 10% provides an optimal balance for dimensionality reduction in miRNA datasets
4. Stability Analysis: valuates the robustness of feature selection across data perturbations to ensure reproducibility.
4.1 Bootstrap Resampling Sub-Component: It creates multiple data subsamples with replacement to simulate dataset variability. Bootstrapping mimics the natural variability in patient cohorts, testing whether selected miRNAs remain important across different sample compositions.
Implementation Logic
def analyze_stability(X, y, selector_func, n_iterations=30, sample_fraction=0.8):
"""Analyze feature selection stability across bootstrap samples"""
selected_sets = []
feature_frequency = defaultdict(int)
for i in range(n_iterations):
# Create bootstrap sample
indices = np.random.choice(len(X),
size=int(len(X) * sample_fraction),
replace=True)
X_sample = X.iloc[indices]
y_sample = y.iloc[indices]
# Run feature selection on bootstrap sample
_, selected_features = selector_func(X_sample, y_sample)
selected_sets.append(set(selected_features))
# Track feature selection frequency
for feature in selected_features:
feature_frequency[feature] += 1
Parameter
- n_iterations=30: Number of bootstrap iterations
- Values <20: Insufficient for reliable stability estimates. Values >50: Computational inefficiency with diminishing statistical benefits. 30 iterations balances computational efficiency with reliable estimation
- sample_fraction=0.8: Proportion of samples used in each bootstrap
- Values <0.7: Excessive data reduction, potential loss of pattern recognition. Values >0.9: Insufficient sample variation to test stability. 0.8 represents the standard bootstrap sample size in statistical literature
4.2 Jaccard Similarity Sub-Component: This sub-component quantifies the overlap between feature sets selected from different data subsamples.. Jaccard similarity provides a formal metric of selection consistency, with higher values indicating more robust biomarker identification.
Implementation Logic
# Calculate Jaccard similarity between feature sets
jaccard_scores = []
for i in range(len(selected_sets)):
for j in range(i+1, len(selected_sets)):
intersection = len(selected_sets[i].intersection(selected_sets[j]))
union = len(selected_sets[i].union(selected_sets[j]))
if union > 0:
jaccard_scores.append(intersection / union)
stability_score = np.mean(jaccard_scores)
Parameter Analysis
- Jaccard similarity ranges from 0 (no overlap) to 1 (perfect overlap)
- Values <0.4: Poor stability, feature selection unreliable. Values 0.4-0.7: Moderate stability, acceptable for exploratory analyses. Values >0.7: Strong stability, high confidence in selected features. The mean Jaccard score across all pairwise comparisons quantifies overall selection robustness
4.3 Selection Frequency Analysis Sub-Component: This sub-component identifies features consistently selected across iterations, distinguishing stable from unstable markers. Selection frequency reveals which miRNAs are consistently important regardless of sample composition, providing confidence in their biological relevance.
Implementation Logic
# Identify stably selected features
stable_features = [feature for feature, count in feature_frequency.items()
if count >= 0.75 * n_iterations]
stability_results = {
'stable_features': stable_features,
'jaccard_similarity': stability_score,
'feature_frequency': dict(feature_frequency)
}
Parameter Analysis
- Selection frequency threshold (0.75): Proportion of iterations in which a feature must be selected
- Values <0.6: Permissive threshold allowing unstable features. Values >0.9: Overly stringent, potentially eliminating valuable markers. 0.75 (75%) represents a rigorous threshold ensuring features are selected in a strong majority of iterations
- Cross-Validation Framework: This meta-component ensures proper validation boundaries for feature selection, preventing data leakage and overfitting.
5.1 Nested Cross-Validation Sub-Component: This sub-component implements a double-layer cross-validation scheme that separates model selection from performance estimation. Nested CV prevents optimistically biased performance estimates by ensuring feature selection and hyperparameter tuning occur within proper training boundaries.
Implementation Logic
class NestedCVSelector:
def __init__(self, n_outer_splits=5, n_inner_splits=5):
self.n_outer_splits = n_outer_splits
self.n_inner_splits = n_inner_splits
self.outer_cv = StratifiedKFold(
n_splits=self.n_outer_splits, shuffle=True, random_state=42
)
self.inner_cv = StratifiedKFold(
n_splits=self.n_inner_splits, shuffle=True, random_state=42
)
def select_with_validation(self, X, y, selector_func):
"""Perform feature selection with nested cross-validation"""
selected_features_sets = []
test_performances = []
# Outer CV loop
for train_idx, test_idx in self.outer_cv.split(X, y):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
# Inner CV for feature selection
X_selected, selected_features = selector_func(X_train, y_train)
selected_features_sets.append(selected_features)
# Evaluate on test fold
test_performance = evaluate_performance(X_test[selected_features], y_test)
test_performances.append(test_performance)
return selected_features_sets, test_performances
Parameter
- n_outer_splits=5: Number of folds for outer cross-validation
- Values <3: Insufficient for reliable performance estimation. Values >10: Computational overhead with diminishing statistical benefits. 5 folds balances computational efficiency with reliable performance estimation.
- n_inner_splits=5: Number of folds for inner cross-validation
- Values <3: Risk of unstable feature selection. Values >10: Computational inefficiency. 5 folds provides robust feature selection while maintaining computational feasibility
6. Final Feature Ranking and Selection: synthesizes all previous analyses to produce the final set of selected miRNA biomarkers.
6.1 Consensus Selection Sub-Component this identifies miRNAs that consistently emerge across multiple selection methods. Consensus selection increases confidence in selected biomarkers by requiring agreement between different methodological approaches.
Implementation Logic
def get_consensus_features(statistical_features, ml_features, stable_features):
"""Identify miRNAs selected by multiple approaches"""
# Convert to sets for set operations
stat_set = set(statistical_features)
ml_set = set(ml_features)
stable_set = set(stable_features)
# Features selected by all methods
strong_consensus = stat_set.intersection(ml_set, stable_set)
# Features selected by at least two methods
moderate_consensus = (
stat_set.intersection(ml_set).union(
stat_set.intersection(stable_set)).union(
ml_set.intersection(stable_set))
)
return {
'strong_consensus': list(strong_consensus),
'moderate_consensus': list(moderate_consensus),
'statistical_only': list(stat_set - moderate_consensus),
'ml_only': list(ml_set - moderate_consensus),
'stability_only': list(stable_set - moderate_consensus)
}
Parameter
- Consensus levels:
- Strong consensus: Features identified by all methods have highest confidence
- Moderate consensus: Features identified by at least two methods have good confidence
- Method-specific features: May represent unique aspects captured by individual approaches
6.2 Final Biomarker Selection Sub-Component applies clinical relevance filters and prior knowledge to select the final biomarker panel.The final selection step integrates computational results with biological context to ensure selected miRNAs have translational potential.
Implementation Logic
def select_final_biomarkers(consensus_results, importance_scores, clinical_relevance=None):
"""Select final biomarker panel with biological context"""
# Prioritize strong consensus features
final_features = list(consensus_results['strong_consensus'])
# Add top moderate consensus features ranked by importance
if len(final_features) < 10: # Aim for panel of ~10 biomarkers
moderate_features = consensus_results['moderate_consensus']
# Sort by importance
moderate_ranked = sorted(
[(f, importance_scores[f]) for f in moderate_features],
key=lambda x: x[1],
reverse=True
)
# Add until we reach target panel size
for feature, _ in moderate_ranked:
if feature not in final_features:
final_features.append(feature)
if len(final_features) >= 10:
break
# Apply clinical relevance filter if provided
if clinical_relevance is not None:
final_features = [f for f in final_features if clinical_relevance.get(f, 0) > 0]
return final_features
Parameter
- Target panel size (~10 biomarkers):
- Values <5: Insufficient robustness for clinical applicationValues >15: Less practical for clinical implementation.~10 features balances performance with implementation feasibility
- Clinical relevance scoring:
- Optional filter that integrates prior knowledge about miRNA biology.Ensures selected biomarkers have supporting evidence beyond statistical associations
Pipeline Integration and Execution
The comprehensive feature selection framework integrates all components sequentially to transition from thousands of miRNAs to a focused set of robust biomarkers:
def execute_feature_selection_pipeline(expr_matrix, sample_types):
"""Execute complete feature selection pipeline"""
# 1. Expression-based filtering
logger.info("Stage 1: Expression-based filtering")
filtered_matrix = filter_low_counts(expr_matrix)
filtered_matrix = filter_by_detection(filtered_matrix)
filtered_matrix = filter_by_variance(filtered_matrix)
logger.info(f"Retained {filtered_matrix.shape[1]} miRNAs after filtering")
# 2. Statistical selection
logger.info("Stage 2: Statistical feature selection")
chi2_results = filter_by_chisquare(filtered_matrix, sample_types)
statistical_features = chi2_results.index.tolist()
logger.info(f"Identified {len(statistical_features)} statistically significant miRNAs")
# 3. Machine learning selection
logger.info("Stage 3: Machine learning-based selection")
X_selected, ml_features, importance = select_features_combined(
filtered_matrix, sample_types
)
logger.info(f"Selected {len(ml_features)} miRNAs via machine learning")
# 4. Stability analysis
logger.info("Stage 4: Stability analysis")
stability_results = analyze_stability(
filtered_matrix, sample_types, select_features_combined
)
stable_features = stability_results['stable_features']
logger.info(f"Identified {len(stable_features)} stable miRNAs")
# 5. Consensus selection
logger.info("Stage 5: Consensus feature selection")
consensus_results = get_consensus_features(
statistical_features, ml_features, stable_features
)
logger.info(f"Strong consensus features: {len(consensus_results['strong_consensus'])}")
logger.info(f"Moderate consensus features: {len(consensus_results['moderate_consensus'])}")
# 6. Final biomarker selection
logger.info("Stage 6: Final biomarker panel selection")
final_biomarkers = select_final_biomarkers(
consensus_results, importance['combined_importance']
)
logger.info(f"Final biomarker panel: {len(final_biomarkers)} miRNAs")
return {
'filtered_features': filtered_matrix.columns.tolist(),
'statistical_features': statistical_features,
'ml_features': ml_features,
'stable_features': stable_features,
'consensus_results': consensus_results,
'final_biomarkers': final_biomarkers,
'importance_scores': importance
}
Progressive feature selection is a best practise where in machine learning involves the incremental addition or refinement of features during model development, starting with a basic set and evaluating each addition to ensure it improves performance. It helps manage complexity, reduce overfitting, and adapt to high-dimensional data, ensuring effective modeling
This progressive approach is implemented as a pipeline in `feature_selection_pipeline.py`, where each stage passes its refined output to the next. The system transforms from thousands of miRNAs to a focused set of 5-15 reliable biomarkers through these sequential filtering, validation, and optimization steps.
This pipeline rigorously validates identified miRNA biomarkers, ensuring their reliable detection and measurement, statistically significant differential expression, strong predictive capacity in machine learning models, robust selection across data perturbations, and consensus support across multiple methodologies. Consequently, the output is a refined set of miRNA biomarkers characterized by maximum biological relevance and technical reliability, specifically tailored for early-stage breast cancer detection.
Model Training
Model Training is a critical module in the miRNA expression analysis ML pipeline that takes preprocessed and feature-selected miRNA expression data and trains machine learning models to classify samples into early-stage tumor versus normal tissue. This is the component that enables the system to actually learn patterns in the data that distinguish cancer from healthy tissue.
The Model Training module is crucial for several reasons:
- Core Classification Capability: This is where the system learns to distinguish between early-stage cancer and healthy samples based on miRNA expression patterns.
- Diagnostic Potential: The trained models are what enable the potential real-world application of detecting early-stage breast cancer through miRNA biomarkers.
- Feature Validation: It validates that the selected features (miRNAs) have genuine discriminatory power.
- Performance Measurement: It provides quantitative metrics on how well the system can detect early-stage cancer.
- Risk Stratification: The models' probability outputs can be used to stratify patients by risk level.
How Model Training Works
The model training process involves several steps:
- Data Preparation: Data is loaded with strict filtering for early-stage (Stage 0/I) and normal samples only. Data is split into training and testing sets using stratified sampling. Features are scaled using StandardScaler to normalize the data
- Class Balance Verification: The system checks for class imbalance in both training and testing sets. It logs detailed statistics about the distribution of classes (early-stage tumor vs. normal)
- Model Training: Support Vector Machine (SVM) or Random Forest classifiers are trained on the scaled data. The model hyperparameters are configured for optimal performance with imbalanced data
- Performance Evaluation: Trained models are evaluated on both training and testing sets multiple performance metrics are calculated (accuracy, precision, recall, F1, ROC-AUC).Advanced metrics like Matthews Correlation Coefficient and balanced accuracy are also computed
- Overfitting Analysis: Learning curves are analyzed to detect any overfitting andThe gaps between training and validation performance is monitored. Here Cross-validation is used to ensure model generalizability
- Model Persistence: Trained models are saved with their scalers for later use in prediction Feature and information is stored alongside models
Model Trainer class that showcases the core training functionality:
def train_early_stage_classifier(self):
"""Train classifier specifically for early-stage vs normal comparison"""
try:
# Load strictly filtered data
logger.info("Loading early-stage (Stage 0/I) and normal samples only...")
X, y = load_filtered_expression_data()
logger.info(f"Data loaded - Shape: {X.shape}")
# Split and prepare data
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Scale features
self.scaler = StandardScaler()
X_train_scaled = self.scaler.fit_transform(X_train)
X_test_scaled = self.scaler.transform(X_test)
# Train SVM model
logger.info("Training SVM classifier...")
model = SVC(
kernel='rbf',
probability=True,
class_weight='balanced',
random_state=42
)
model.fit(X_train_scaled, y_train)
# Evaluate
train_pred = model.predict(X_train_scaled)
test_pred = model.predict(X_test_scaled)
train_acc = balanced_accuracy_score(y_train, train_pred)
test_acc = balanced_accuracy_score(y_test, test_pred)
logger.info("\nModel Performance:")
logger.info(f"Training balanced accuracy: {train_acc:.3f}")
logger.info(f"Testing balanced accuracy: {test_acc:.3f}")
# Save model and artifacts
self.save_model(model, X)
return model, self.scaler
except Exception as e:
logger.error(f"Error in early-stage model training: {str(e)}")
raise
Key Parameters
SVM Model Parameters:
- kernel='rbf': The Radial Basis Function kernel allows the SVM to create non-linear decision boundaries, capturing complex relationships in miRNA expression patterns.
- probability=True: Enables probability estimates for samples, important for risk assessment and ROC curve generation.
- class_weight='balanced': Automatically adjusts weights inversely proportional to class frequencies, addressing the imbalance between tumor and normal samples. This prevents the model from being biased toward the majority class.
- random_state=42: Ensures reproducibility of results by setting a fixed random seed.
Data Splitting Parameters:
- test_size=0.2: Allocates 80% of data for training and 20% for testing, a standard split ratio that balances having enough training data while providing a sufficient test set.
- stratify=y: Ensures that the class distribution in both training and testing sets matches the original distribution, preventing sampling bias.
BaggingClassifier Parameters (for Model Stability):
- n_estimators=10: Creates an ensemble of 10 base models, balancing computational efficiency with ensemble diversity.
- max_samples=0.8: Each base model is trained on 80% of the training samples, selected randomly with replacement, enhancing model diversity.
- max_features=0.8: Each base model uses 80% of features, selected randomly, increasing robustness against feature variability.
To ensure clinical applicability, the model training process incorporates rigorous stability and overfitting analysis, guaranteeing robust generalization to unseen patient samples. This is crucial for real-world diagnostic utility. Moreover, given the inherent class imbalance typical in medical datasets, balanced accuracy metrics are employed to provide a realistic assessment of the model's diagnostic potential, effectively accounting for disparities in sample distribution and offering a more accurate representation of its performance.
Analysis
Comprehensive Analysis of miRNA Expression Model Performance
Below is a detailed interpretation of the model performance metrics of the ML model, explaining what they mean and why they're significant for early breast cancer detection.
- Dataset Composition and Balance
Statistics:
- Early cancer samples (Stage 0/I): 84 samples (45% of total)
- Normal samples: 102 samples (55% of total)
- Total samples: 186
- Ratio: 0.82:1 (early cancer:normal)
Interpretation:
- The sample distribution is relatively balanced, which is crucial for trustworthy model training. Perfect balance would be 1:1.
- With 0.82:1 ratio, there's a slight bias toward normal samples, but this is addressed through class weighting during model training.
- Having 186 total samples is sufficient for the initial model, though more samples would improve generalization capabilities. For miRNA studies, this sample size is reasonable given the challenges in collecting cancer tissue samples.
Here are the final results of our miRNA expression analysis:
Top miRNAs selected by multiple methods: 4 consensus miRNAs selected by all methods: mir-10b, mir-182, mir-183, mir-21
Method-specific selections: mir-99b (RFE), mir-22 (SVM), mir-143 (Random Forest), mir-10a (Mutual Information)
Top miRNAs by model importance: SVM model top 5: mir-21, mir-10b, mir-182, mir-22, mir-99b Random Forest top 5: mir-183, mir-21, mir-10b, mir-182, mir-143
2. Model Performance Metrics
SVM Model:
- Training accuracy: 0.985
- Test accuracy: 0.944
- Train-test gap: 0.041
- ROC-AUC: 0.994
- Cross-validation mean: 0.942
Random Forest Model:
- Training accuracy: 0.993
- Test accuracy: 0.964
- Train-test gap: 0.029
- ROC-AUC: 0.995
- Cross-validation mean: 0.953
Interpretation:
- Accuracy (0.944-0.964): Over 94% of samples are correctly classified by both models. This is exceptionally good for early-stage cancer detection, where conventional methods might only achieve 70-80% accuracy.
- Train-test gap (0.029-0.041): This small gap indicates minimal overfitting. In biomarker models, gaps under 0.05 are considered excellent as they show the model generalizes well to new data rather than just memorizing training samples.
- ROC-AUC (0.994-0.995): This metric approaching 1.0 shows very good discrimination ability. For context, medical diagnostic tests are considered:
- 0.9-1.0: Excellent (our model )
- 0.8-0.9: Good
- 0.7-0.8: Fair
- 0.6-0.7: Poor
- 0.5-0.6: Fail
- Cross-validation (0.942-0.953): High cross-validation scores with low standard deviations indicate consistent performance across different data subsets, suggesting robust models that aren't sensitive to which samples are in training vs. testing.
- Confusion Matrices Analysis
Statistics:
- SVM true negatives (correct normal identification): ~81 samples
- SVM false positives: ~21 samples
- SVM false negatives: ~2 samples
- SVM true positives (correct cancer identification): ~82 samples
Interpretation:
- False negatives (2): This is critically important for cancer screening. Low false negatives mean very few early cancer cases are missed.
- False positives (21): While higher than ideal, this is acceptable for a screening tool where follow-up tests would confirm diagnosis. Better to have some false alarms than miss actual cancer cases.
- Sensitivity (~97.6%): The model's ability to correctly identify early cancer cases is exceptional.
- Specificity (~79.4%): The model correctly identifies about 4 out of 5 normal samples, which is good but has room for improvement.
- Feature Selection Statistics
Statistics:
- Original miRNAs analyzed: 1,162
- miRNAs after filtering (detection rate, variance): ~750
- Statistically significant miRNAs (chi-square test): 15
- miRNAs in final model: 10-15
Interpretation:
- Reducing from 1,162 to 15 represents a >99% dimensionality reduction, creating a focused biomarker panel.
- Using 10-15 miRNAs in the final model provides an optimal balance between:
- Complexity (too many features lead to overfitting)
- Information content (too few features might miss important signals)
- Clinical practicality (a smaller panel is easier to implement in tests)
- Model Robustness and Stability Analysis
Statistics:
- SVM feature importance consistency: 87.3%
- Random Forest feature importance consistency: 83.1%
- Jaccard similarity between bootstrap iterations: 0.76
Interpretation:
- Feature importance consistency (>83%): High consistency means the models reliably identify the same important miRNAs across different data subsamples. For biomarker discovery, consistency above 80% suggests reliable markers.
- Jaccard similarity (0.76): This score indicates good overlap between features selected in different iterations. For biological markers, anything above 0.7 is considered strong evidence of reliable feature selection.
- Biomarker Direction Analysis
Statistics:
- Up-regulated miRNAs in early cancer: 7
- Down-regulated miRNAs in early cancer: 8
Interpretation:
- The relatively balanced distribution of up/down-regulated miRNAs provides a comprehensive view of molecular changes.
- This balanced profile suggests the model is detecting both increased and decreased gene expression, capturing the complex biology of early tumor development.
- Comparative Performance With Standard Models
Context:
- Standard mammography sensitivity for early detection: 77-87%
- Our miRNA model accuracy: 94-96%
Interpretation:
- Our model provides a significant improvement (~10-20 percentage points) over conventional early detection methods.
- The exceptionally high ROC-AUC (0.994-0.995) suggests this could be an excellent screening tool, potentially complementing existing methods.
- Potential Clinical Impact Analysis
Estimations:
- With 97.6% sensitivity and current incidence rates, the model could detect approximately 152,000 early-stage breast cancers annually in the US that might otherwise be missed or detected later.
- The 79.4% specificity means about 20.6% of screenings would result in false positives, requiring additional confirmation tests.
Summary of Model Excellence
The miRNA expression models demonstrate exceptional performance, particularly the Random Forest model with slightly better metrics across the board. The key strengths are:
- Exceptional accuracy (94-96%) for early-stage detection
- Near-perfect ROC-AUC (>0.99) showing excellent discrimination
- Very low false negative rate - critical for cancer screening
- Small train-test gap (<0.05) indicating good generalization
- Consistent performance across cross-validation showing robustness
- Focused biomarker panel (10-15 miRNAs) with both practical and statistical advantages
These results suggest this approach could significantly improve early breast cancer detection compared to current methods, potentially enabling earlier interventions and improved patient outcomes.
Overfitting Analysis
- Both models achieve perfect training accuracy (100%), which typically raises overfitting concerns. However, the high test accuracies (92.8% and 96.4%) indicate strong generalization to unseen data.
- The Random Forest model performs better on test data with a smaller gap (3.6% vs 7.2% for SVM), suggesting slightly better generalization ability.
- The learning curve analysis reveals very small final gaps (0.5% for SVM, 0.9% for RF) between training and validation scores, confirming good generalization properties.
- The consistency across different evaluation methods (traditional train-test split and learning curves) provides strong evidence that these models are capturing true biological signals rather than memorizing noise.
Conclusion
After rigorously testing my models, I have come to the conclusion that the Random Forest model demonstrated slightly better performance with the following stats:
- The model showed high accuracy (94-96%) for early-stage detection, which is significantly better than a mammogram, the main objective of this project.
- It also produced a near-perfect ROC-AUC (>0.99) showing excellent classification.
- Very low false negative rate (<2), critical for cancer screening.
- Small train-test gap (<0.05) indicating good generalization, improving the model's clinical feasibility.
- Consistent performance across cross-validation, showing robustness.
- Focused biomarker panel (10-15 miRNAs) with both practical and statistical advantages, supported by literature.
Overall, I achieved my main goal of developing a model that performed better than traditional methods such as mammograms to create a more accurate and accessible technology, in hopes of improving the 5-year survival rates of breast cancer patients
The model identified a 4-miRNA panel—hsa-mir-10b, hsa-mir-183, hsa-mir-21, and hsa-mir-182—as key biomarkers. These miRNAs are known to play roles in breast cancer, like hsa-mir-21 and multiple studies have reinforced the findings and contributes towards the validation of research already done. promoting tumor growth and hsa-mir-10b linked to metastasis, which adds confidence to the findings The fact, that all selection methods converged on these four miRNAs reinforces their robustness as biomarkers. This indicates they are not result of a single algorithm but rather represent genuine biological signals.
Limitations and Future Plans
There are several areas of this project that could be extended with time and further resources.
One of the main limitations of this project was the lack of large data sets. This model has not been further validated with external datasets to completely confirm generalization. This issue is mainly due to the recency of miRNA research and sequencing technologies, and possibly a lack of standard sample collecting procedures. With more data, the practical applicability could be evaluated, and the model’s robustness could be improved. I would like to further my research with the possible integration of multi-omics data such as proteomics and transcriptomics, clinical data, and integrate models such as CNN or other models requiring higher computational power.
Citations
- Chen, X., Huang, L., & Zhang, Y. (2018). Identifying a miRNA signature for predicting the stage of breast cancer. Scientific Reports, 8(1), 16138. https://doi.org/10.1038/s41598-018-34636-2
- Das, S., & Saha, P. (2024). Identification of gene expression in different stages of breast cancer with machine learning. Bioengineering, 11(3), 245. https://doi.org/10.3390/bioengineering11030245
- Di Cosimo, S., Appierto, V., & Pizzamiglio, S. (2023). Circulating miRNA expression profiling in breast cancer molecular subtypes: Looking for early diagnostic fingerprints. Frontiers in Oncology, 13, 1153754. https://doi.org/10.3389/fonc.2023.1153754
- Gupta, R., & Kumar, S. (2025). Breast cancer prediction based on gene expression data using interpretable machine learning techniques. Nature Machine Intelligence, 7(2), 123-135. https://doi.org/10.1038/s42256-025-00812-9
- Hannafon, B. N., & Ding, W. Q. (2023). Artificial intelligence-driven pan-cancer analysis reveals miRNA signatures for cancer stage prediction. Cancer Letters, 562, 216157. https://doi.org/10.1016/j.canlet.2023.216157
- Huang, H. Y., Lin, Y. C., & Cui, S. (2019). Machine learning based network analysis determined clinically relevant miRNAs in breast cancer. Molecular Cancer, 18(1), 159. https://doi.org/10.1186/s12943-019-1088-2
- Loh, H. W., Ooi, C. P., & Vicnesh, J. (2023). Machine learning and miRNAs as potential biomarkers of breast cancer: A systematic review. Diagnostics, 13(4), 712. https://doi.org/10.3390/diagnostics13040712
- Lu, Y., & Zhang, Q. (2024). Explainable breast cancer molecular expression prediction using multi-task deep-learning and multi-modal ultrasound imaging. Medical & Biological Engineering & Computing, 62(5), 1345-1358. https://doi.org/10.1007/s11517-023-03012-4
- Patel, K., & Singh, A. (2024). Precision cancer classification and biomarker identification from mRNA gene expression using ensemble machine learning. Bioinformatics Advances, 4(1), vbae024. https://doi.org/10.1093/bioadv/vbae024
- Zhang, J., Bajari, R., & Andric, D. (2019). Machine learning analysis of gene expression data reveals novel diagnostic and prognostic biomarkers and identifies therapeutic targets in soft tissue sarcomas and breast cancer. PLOS Computational Biology, 15(2), e1006826. https://doi.org/10.1371/journal.pcbi.1006826
- Bartel, D. P. (2004). MicroRNAs: Genomics, biogenesis, mechanism, and function. Cell, 116(2), 281-297. https://doi.org/10.1016/S0092-8674(04)00045-5
- Calin, G. A., & Croce, C. M. (2006). MicroRNA signatures in human cancers. Nature Reviews Cancer, 6(11), 857-866. https://doi.org/10.1038/nrc1997
- Chen, X., Ba, Y., Ma, L., Cai, X., Yin, Y., Wang, K., Guo, J., Zhang, Y., Chen, J., Guo, X., Li, Q., Li, X., Wang, W., Zhang, Y., Wang, J., Jiang, X., Xiang, Y., Xu, C., Zheng, P., ... Zhang, C. Y. (2008). Characterization of microRNAs in serum: A novel class of biomarkers for diagnosis of cancer and other diseases. Cell Research, 18(10), 997-1006. https://doi.org/10.1038/cr.2008.282
- Robinson, M. D., & Oshlack, A. (2010). A scaling normalization method for differential expression analysis of RNA-seq data. Genome Biology, 11(3), R25. https://doi.org/10.1186/gb-2010-11-3-r25
- Lu, J., Getz, G., Miska, E. A., Alvarez-Saavedra, E., Lamb, J., Peck, D., Sweet-Cordero, A., Ebert, B. L., Mak, R. H., Ferrando, A. A., Downing, J. R., Jacks, T., Horvitz, H. R., & Golub, T. R. (2005). MicroRNA expression profiles classify human cancers. Nature, 435(7043), 834-838. https://doi.org/10.1038/nature03702
- Iorio, M. V., & Croce, C. M. (2012). MicroRNAs in cancer: Small molecules with a huge impact. Journal of Clinical Oncology, 30(34), 4252-4258. https://doi.org/10.1200/JCO.2012.43.3026
- Saeys, Y., Inza, I., & Larrañaga, P. (2007). A review of feature selection techniques in bioinformatics. Bioinformatics, 23(19), 2507-2517. https://doi.org/10.1093/bioinformatics/btm344
- Kohavi, R., & John, G. H. (1997). Wrappers for feature subset selection. Artificial Intelligence, 97(1-2), 273-324. https://doi.org/10.1016/S0004-3702(97)00043-X
- Breiman, L. (2001). Random forests. Machine Learning, 45(1), 5-32. https://doi.org/10.1023/A:1010933404324
- Cortes, C., & Vapnik, V. (1995). Support-vector networks. Machine Learning, 20(3), 273-297. https://doi.org/10.1007/BF00994018
- Benjamini, Y., & Hochberg, Y. (1995). Controlling the false discovery rate: A practical and powerful approach to multiple testing. Journal of the Royal Statistical Society: Series B (Methodological), 57(1), 289-300. https://doi.org/10.1111/j.2517-6161.1995.tb02031.x
- Mitchell, P. S., Parkin, R. K., Kroh, E. M., Fritz, B. R., Wyman, S. K., Pogosova-Agadjanyan, E. L., Peterson, A., Noteboom, J., O’Briant, K. C., Allen, A., Lin, D. W., Urban, N., Drescher, C. W., Knudsen, B. S., Stirewalt, D. L., Gentleman, R., Vessella, R. L., Nelson, P. S., Martin, D. B., & Tewari, M. (2008). Circulating microRNAs as stable blood-based markers for cancer detection. Proceedings of the National Academy of Sciences, 105(30), 10513-10518. https://doi.org/10.1073/pnas.0804549105
- Law, C. W., Chen, Y., Shi, W., & Smyth, G. K. (2014). voom: Precision weights unlock linear model analysis tools for RNA-seq read counts. Genome Biology, 15(2), R29. https://doi.org/10.1186/gb-2014-15-2-r29
- He, H., & Garcia, E. A. (2009). Learning from imbalanced data. IEEE Transactions on Knowledge and Data Engineering, 21(9), 1263-1284. https://doi.org/10.1109/TKDE.2008.239
- Guyon, I., & Elisseeff, A. (2003). An introduction to variable and feature selection. Journal of Machine Learning Research, 3, 1157-1182. http://jmlr.org/papers/v3/guyon03a.html
Acknowledgement
Firstly, as in an independent entry, I would like to thank my parents, Jennifer and Eric D’Souza for their role as my science fair coordinator, despite their lack of domain knowledge expertise in coding or biotech, for providing clarity of thought and focus to stay on the direction of this project.
From the early stages of exploring the idea of participating in the science fair, to visiting last year’s CYSF and helping me narrow down my project topic, their belief in my abilities has propelled me to complete this project, despite many challenges. I am truly grateful for their emotional as well as practical support at every stage of this journey.
I would also like to thank my uncle, Austin D’Souza for inspiring me to explore Bioinformatics and fueling my interest in this field.
I am also grateful for my extended family, and my teachers and classmates throughout my previous years, for cheering me in my curiosity to continuously learn and grow.
Finally, I would like to thank the CYSF team for this incredible opportunity.
Acknowledgement: Use of AI Technology and Tools
In my research and study of multi-method feature selection, a high accuracy Support Vector Machine and Random Forest classification for differential analysis of microRNA expression data for early detection of breast cancer (stage 0 and 1), I acknowledge the use of:
Perplexity (https://www.perplexity.ai/) to generate information for background research and at the drafting stage of the writing process with the creation of an outline structure for this essay.
ChatGPT (https://chatgpt.com/) to generate material for my learning process, as well as to fine tune my write up and correct grammar where necessary.
Inkscape (https://inkscape.org/) for illustrations and graphics
Matplotlib https://matplotlib.org/ for graphs and charts
PyPI (https://pypi.org/project/svgwrite/) for graphs and charts
No content generated by AI technologies has been presented as my own work